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:
- Abrir el archivo como binario de
acceso de solo lectura
- 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.
- Si no coinciden, ir al paso 2.
- Si coinciden, leer el siguiente byte y
compararlo con el siguiente carácter del texto
buscado.
- Si no coinciden, retroceder el puntero
al archivo al byte de la siguiente a la lectura
secuencial e ir al paso 2.
- 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. |
|