Un Motor de Búsqueda Local (Explorador de Texto)


Una aplicación que busca cierto texto, empezado desde la carpeta que se le indique, y reporta una lista con los archivos que lo contienen

Por Harvey Triana

Introducción

Suena algo impactante Un Motor de Búsqueda Local, pero en realidad ese es el propósito, es decir, que al estilo de un motor de búsqueda de Internet, deseo que una aplicación me busque cierto texto empezando desde la carpeta que le indique, y me reporte de lista con los archivos que lo contienen. Tal vez quedaría mejor el titulo Explorador de Texto, pero el impacto no es igual; Ustedes juzgaran. Este articulo es una guía para comenzar una aplicación fuerte si se quiere, aunque la que suministro esta bastante completa, el resto corre por cuenta de sus inquietudes y necesidades.


Origen del Problema

Posiblemente a todos nos a pasado que alguna vez necesitábamos desesperadamente algo que escribimos hace tiempo y no recordamos en que archivo lo guardamos, y peor aun no recordamos si fue en un documento de procesador de texto o en una hoja electrónica. En el mejor de los casos tenemos que abrir y revisar pocos o muchos documentos, y si hay suerte encontramos aquello, no sin perder bastante tiempo. Pues bien, con esa premisa me lance a escribir un programa que haga eso, es decir, que busque por mi un texto en la carpeta o carpetas que yo le ordene. Muy posiblemente exista software comercial muy bueno para esto, pero es un buen ejercicio para los programadores Visual Basic y le agradará.


Algoritmo de Solución

Ya se habrán imaginado que se trata de programación de acceso binario. Pero ¿cómo empezar y lograr la máxima eficiencia?. Existen algunos aspectos a considerar:

  • Necesito emular algo como la poderosa instrucción InStr()
  • No puedo cargar todo el archivo en memoria RAM para explorarlo (desconozco el tamaño)
  • Seria excelente que no interesara si el archivo esta abierto (esto me brindaría una capacidad multiusuario)
  • Necesito optimizar la velocidad al máximo.

Bien, la técnica que aplico suministra todas esta ventajas. Todos los archivos pueden ser tratados como binarios. No obstante, estas cadenas de bytes deben ser exploradas de manera secuencial, dado que su orden es aleatorio; vaya paradoja. El siguiente algoritmo lo diseñe pensado en una eficiencia máxima:

  1. Abrir el archivo como binario de acceso de solo lectura
  2. 2. Leer el siguiente byte y compáralo con el primer carácter del texto a explorar. Si la lectura secuencial ha terminado, dar salida al ciclo y reportar un NoMatch.
  3. Si no coinciden, ir al paso 2.
  4. Si coinciden, leer el siguiente byte y compararlo con el siguiente carácter del texto buscado.
  5. Si no coinciden, retroceder el puntero al archivo al byte de la siguiente a la lectura secuencial e ir al paso 2.
  6. Si coinciden, continuar hasta que todos coincidan y la lectura de bytes sea igual al numero de caracteres del texto, entonces dar salida y reportar el éxito.

¿Complicado?. En realidad los algoritmos nunca son amistosos, pero cuando se trata de algo así, es mejor imaginárselo primero. Además, a medida que la solución se crea, el algoritmo se cambiara un poco, pero en esencia se conserva la idea.

Básicamente son dos pasos los que cumplen con las perceptivas de la solución. Primero, el paso (1) sugiere acceso binario de solo lectura, esto agiliza el acceso secuencial y permite que se explore un archivo abierto; por ejemplo, hice una prueba con un archivo Word abierto y la búsqueda no presento problemas. Segundo, en el paso (2) comparo un solo carácter, por supuesto esto agilizara enormemente la comparación y, por consiguiente, la velocidad de la solución; en particular, en archivos binarios como los creados con Word©, se ignoraran aquellas partes estrictamente binarias (caracteres no alfabéticos). Como una particularidad, el paso (4) es una optimización, aunque solo logre una mejora del 6%, sobre la comparación del texto buscado como una unidad.


Una Aplicación Sencilla

Empleando la teoria expuesta anteriormente, he creado la siguiente aplicación:

Tal como está, la aplicación presta un buen servicio. Francamente recomiendo su código porque involucra bastantes detalles que pueden ser didácticos para cualquier programador Visual Basic. Esta pequeña aplicación cumple las perspectivas del algoritmo que expuse al principio, y una optimización adicional para dar mayor velocidad. El código le puede bajar de la revista Algoritmo .


Bemoles

Como todos los programas son falibles, este no es la excepción. Archivos antiguos, como ayudas DOS, son indescifrables por este algoritmo y la exploración no tiene éxito. Lo mismo ocurre con Bases de Datos codificadas, aunque esto realmente es preferible. Otro caso inevitable, son por ejemplo archivos de procesador de palabras que tienen incluidas imágenes en el propio código del archivo, esto hace que se pierda algo de tiempo explorando zonas muertas en cuanto a texto. Otro caso es que la exploración se hace al 100% del archivo, paradójicamente puede encontrar texto que no es visible en la edición del documento, p.e. en la ficha de propiedades de un documento Word© puede haber escrito comentarios que solo son visibles si Usted va a ese Dialogo, el Explorador de Texto busca también allí.

Existe también un lío con ciertas páginas HTML, donde las tildes usan un código especial, en particular las HTML, creadas con Word ® o Corel Web Designer ®, no obstante, esto es sencillo de corregir (el Freeware no tiene esta corrección aún).


Aquí incluyo un Explorador de Texto.EXE de Visual Basic 5.0 (requiere el Runtime de VB5) Freeware: expltext.zip (10 k). Muy recomendado.