FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Búsqueda de contenido en documentos Word en Linux
Qué tal foro.
Antes que nada les agradezco a todos el tiempo que se dan para compartir conocimientos con los demás, en más de una ocasión me han sacado de apuros, considerando que soy un novato. Pues así como dice el título. Les comento: Tengo un sistema de gestión de documentos alojado en un servidor Linux; la base de datos es postgres, el programa está hecho en Delphi (en qué otra cosa?! ) y en un directorio del mismo servidor se almacenan los documentos de Word principalmente. El programa funciona bien; registran un documento de Word, le ponen un título, el sistema asigna un nombre de archivo que se almacena y posteriormente lo recuperan a modo de plantilla; también pueden hacer búsquedas de archivos y que se localizan por medio del título que hubieran escrito, todos éstos datos están en postgres; hasta ahí todo bien pero... Al cliente se le ocurrió que quiere hacer búsquedas por palabras en el contenido de los documentos de Word y posteriormente listar los archivos para que puedan abrirlos y trabajar con ellos. Después de mucho darle vueltas he logrado realizar la dichosa búsqueda, se tarda uno o dos minutos más que en el Explorer de Windows, pero no siendo yo Microsoft, es tolerable. La cuestión es que para hacer esa búsqueda abro cada uno de los archivos de Word (de uno en uno) y realizo la búsqueda, mi pregunta es: ya que los archivos están en el servidor al momento de abrirlos y cerrarlos desde los equipos cliente, seguramente me va a generar bastante tráfico. Había pensado en hacer ese mismo procedimiento de búsqueda desde dentro del servidor y únicamente enviar los resultados al cliente pero no tengo idea de como hacerlo en Linux. Alguien tiene alguna sugerencia de cómo se podría solucionar esto? De antemano, muchas gracias a todos. Eduardo Laguna.
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda) |
#2
|
||||
|
||||
Con grep puedes buscar un texto dentro de ficheros y la salida puedes enviarla a un fichero.log (por ejemplo).
Aunque puede que te convenga más guardar el documento dentro de la base de datos y hacer la búsqueda ahí. Si no son muchos millones de documentos
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
||||
|
||||
Pero grep es para archivos de texto ¿no? En un documento de word, no sé si podrá buscar.
// Saludos |
#4
|
||||
|
||||
Cita:
Creo que la mejor opción es crear un sistema de etiquetas/tags/palabras claves... que se guarden en un campo junto al registro, pero ahí se dependería de que el usuario que crea el registro lo haga correctamente y ponga las etiquetas adecuadas para luego encontrarlo.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#5
|
||||
|
||||
Hola a todos.
Creo que Grep tratará el documento cual fuese un documento de texto cualquiera. así que en teoria si podrá encontrar una cadena dentro del documento.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
#6
|
||||
|
||||
En principio había contemplado el guardar los documentos dentro de la base de datos, pero como son documentos con bastantes "cosillas" en su formato pues mejor los dejamos por fuera y en la base sólo guardo la ruta del archivo.
Por otra parte ya había intentado con catdoc y grep desde terminal pero no funciona con .docx
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda) |
#7
|
||||
|
||||
En principio, recordemos que un archivo .doc/.docx/.odt, etc... no es mas que un paquete con mas archivos en su interior que definen el contenido y estructura del documento, entonces, si podemos desempaquetar ese archivo y manipular su contenido seremos los dioses del universo ...ah no, creo que ya me pasé.
Así que, como el .doc y .docx son formatos cerrados, porqué no convertirlos a un .odt (automatizado, claro) o similar y buscar el contenido allí. Revisando el código de loook podemos ver esto: Código:
def processFile(self, filename, query): suffix = self.getSuffix(filename) try: # Handle OpenOffice.org files: if suffix in ('sxw', 'stw', # OOo 1.x swriter 'sxc', 'stc', # OOo 1.x scalc 'sxi', 'sti' # OOo 1.x simpress 'sxg', # OOo 1.x master document 'sxm', # OOo 1.x formula 'sxd', 'std', # OOo 1.x sdraw 'odt', 'ott', # OOo 2.x swriter 'odp', 'otp', # OOo 2.x simpress 'odf', # OOo 2.x formula 'odg', 'otg', # OOo 2.x sdraw 'ods', 'ots' # OOo 2.x scalc ): zip = zipfile.ZipFile(filename, "r") content = "" docinfo = "" try: # TODO: are all OOo files utf-8? content = unicode(zip.read("content.xml"), 'utf-8') # TODO: is replace_with_space=0 correct? content = self.removeXMLMarkup(content, replace_with_space=0) docinfo = unicode(zip.read("meta.xml"), 'utf-8') docinfo = self.removeXMLMarkup(docinfo, replace_with_space=0) self.ooo_count = self.ooo_count + 1 except KeyError, err: print "Warning: %s not found in '%s'" % (err, filename) return None title = "" title_match = re.compile("<dc:title>(.*?)</dc:title>", re.DOTALL|re.IGNORECASE).search(docinfo) if title_match: title = title_match.group(1) if self.match(query, "%s %s" % (content.lower(), docinfo.lower())): return (filename, title) except zipfile.BadZipfile, err: print "Warning: Supposed ZIP file '%s' could not be opened: %s" % (filename, err) except IOError, err: print "Warning: File '%s' could not be opened: %s" % (filename, err) return None No te digo que hagas esto con cada búsqueda, sino que, se me ocurre que al momento de que se carga un nuevo documento al sistema se extraiga el contenido de este y se almacene en una bd o en otro lugar donde se nos simplifique la búsqueda. Saludos |
#8
|
||||
|
||||
Interesante ese loook
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#9
|
||||
|
||||
cough.. cough.. ¿dije que está hecho en python?
|
#10
|
||||
|
||||
ya, ya...
Si tengo muchas pequeñas utilidades de línea de comando que hacen cosas fantásticas fácilmente y están hechas en python
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#11
|
||||
|
||||
Cita:
Primero, si ya tienes resuelto como extraer el texto de los documentos de word, que por mucho es el paso MAS dificil, entonces lo puedes colocar en un campo TEXT de la BD de postgres. Una vez alli, montas una busqueda de texto completo: http://www.postgresql.org/docs/9.1/s...extsearch.html Y obtendras resultados es milisegundos (con los indices adecuados, que te lo explica la documentacion) y busquedas tipo google. El resto es mantener actualizado el cache del contenido que metes en la BD (recuerda, es el texto de word, NO el archivo). Para eso, puedes usar una comparación de timestamp + tamaño de archivo y/o MD5 de estos + un detector de que el archivo ha cambiado.
__________________
El malabarista. |
#12
|
||||
|
||||
Cita:
Interesante y práctico, lo voy a probar y les comento. Lo único aquí sería la cantidad de texto que entraría en el campo text, pero veremos qué pasa. Con la sugerencia del compañero D-MO, está muy interesante el proceso, sólo que los equipos clientes son todo Microsoft y los usuarios no tienen tiempo (ni ganas!!) de aprender como cambiar el formato de su archivo de .odt a .docx, aparte de que algunas cosas tales como texto resaltado, comentarios y otras cosas se manejan distinto de un formato a otro. Pero para documentos más sencillos funciona perfectamente. Cuando hago la búsqueda directa en .docx se tarda unos minutos, pero al hacer la conversión, aún cuando se está realizando en el servidor Linux se tarda un poco más. Pero muy interesante el método. Gracias a todos.
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda) |
#13
|
||||
|
||||
Cita:
Saludos |
#14
|
||||
|
||||
Solucionado
Muchas gracias a todos los que se tomaron el tiempo de leer, pero principalmente gracias a los que aportaron ideas.
Entre que ya había logrado sacar la información de los Word y con las sugerencias de mamcx y de D-MO se solucionó el problema, además de otra solución colateral. Del modo en que en un principio lo estaba haciendo, mantenía oculto Word y realizaba las búsquedas en cada uno de los archivos, pero si mientras se ejecutaban las búsquedas, abrías Word entonces se quedaba abierto permanentemente o se cerraba (según la parte de código que se estuviera ejecutando) y se mostraba todo el proceso, pero no dejaba trabajar en ningún otro archivo (algo faltó por ahí al instanciar ). Con la solución final, como todo se hace en el servidor, es mucho más rápido y no "molestamos" a Microsoft con nada. Gracias a todos. Son geniales!!! Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda) |
#15
|
||||
|
||||
Me alegra saber que sirvió de algo las aportaciones que se hicieron. Sería bueno que detallaras un poco mas de como quedó el proceso final para que nos sirva de retroalimentación.
Saludos |
#16
|
||||
|
||||
Cita:
Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda) |
#17
|
||||
|
||||
No te apures, que no hay prisa
|
#18
|
||||
|
||||
Solucionado (definitivamente)
Pues como quedamos, esta es la solución que implemente para las búsquedas.
1. Modifiqué mi tabla en la DB (Postgresql) para almacenar al contenido de cada documento. Mi tabla se llama "planti_corr", agregué un campo de texto e indexé la tabla por ese campo siguiendo lo indicado por mamcx y en la documentación http://www.postgresql.org/docs/9.1/s...extsearch.html
2. Ahora que extraer el contenido de cada documento que se vaya a dar de alta, esto lo hice en el botón de "Altas" en el formulario de registro de documentos:
3. Ahora la búsqueda. En otro botón:
Estas son las instrucciones básicas, obviamente hay cosas antes y después, pero concretando esta es la forma en que lo solucioné y efectivamente el tiempo de la búsqueda se redujo de algunos minutos a pocos segundos, bastante bien diría yo!!!. Muchas gracias a todos, especialmente a mamcx y a D-MO por sus ideas (prácticamente la solución) Saludos. Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda) |
#19
|
||||
|
||||
Muchas felicidades y muchas gracias por la solución
Este hilo me parece que puede ser de ayuda para mucha gente. // Saludos |
#20
|
||||
|
||||
Cita:
A ti te agradecemos que hayas compartido la solución. Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
adjuntar documentos de word | pabloloustau | Conexión con bases de datos | 5 | 04-04-2010 02:13:04 |
Documentos de word | zidfrid | C++ Builder | 2 | 05-09-2008 03:17:11 |
Formatear documentos Word | abril0404 | Servers | 1 | 27-02-2008 15:23:25 |
documentos .dot(word) en delphi | CARSOFT_AR | Varios | 2 | 11-02-2005 18:39:25 |
documentos word | Albano | Varios | 0 | 12-01-2005 03:19:38 |
|