FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Sobre las funciones Pos y PosEx en Delphi
Hola,
En cierto programa con el que estoy útilmamente algo liado compuse un componente muy sencillo que permite que se pueda buscar un determinado texto (una determinada cadena) en archivos (así, para qué iba a quedarme corto, total). Es el caso que en un momento dado utilizo la función "Pos" de Delphi, que, justamente, devuelve la posición de una determinada cadena en un texto dado, objetivo fundamental del componente susomentado. Lo que me preocupa es lo siguiente: Donde "j" es una variable de tipo integer que guardará el resultado de la función "Pos"; "FTextoABuscar" es la cadena que se trata de encontrar... y "archivo" es una variable de tipo "TStringsList" mediante cuya propiedad "Text" obtenemos ya el texto contenido en un determinado archivo en el que buscar la cadena de marras. Mi preocupación pasa porque el texto en donde buscar puede ser considerable, teniendo en cuenta que el componente "buscador" que he tomado por solución no es muy inteligente (cómo iba a serlo) y no discrimina archivos de menos de 5 MB, por ejemplo, y permite buscar en todo tipo de archivos, aun cuando en realidad no sepa qué hacer con algunos de ellos, o para qué los quiere, si no va a saber procesarlos correctamente. Yo creo que se me entiende: ¿Hay alguna forma mejor y más razonable, eficaz, indicada, pertinente, en fin, no que usar la función "Pos" teniendo en cuenta lo que digo, que los archivos pueden ser considerables y, por ende, el texto en el que va a tener que operar dicha función puede ser también considerable, incluso una barbaridad, a mi entender? A lo mejor es que lo que yo entiendo por barbaridad no lo es tanto. O a lo mejor los tiros van por utilizar la función "PosEx" de Delphi. No les quiero aburrir, pero esta función cuenta con un parámetro más, que, de nombre "OffSet" a mí me parece algo espacial, ¿entienden? Como que pudiera resultar mejor, pero tal vez me equivoque, porque "tantum locus est". Además de que la ayuda de Delphi para las funciones mencionadas es algo así como "y hasta aquí puedo leer..." y me quedo con un palmo de narices. Termino ya, pero, no quiero dejar de decir algo. ¡Que me preocupa todo lo que he contado, que lo he hecho para ver qué me aconsejan o qué me dicen, pero, en todo caso, el componente no funciona del todo mal, es bastante rápido buscando archivos y texto en ellos, podría incluso decirse que uno está más o menos contento con el resultado! Puesto que comparado con programas de la talla de "Search and Replace" ni remotamente se parecen, claro está, pero los tiempos de búsqueda van ahí, ahí... que no se diferencian en mucho en "benchmark" caseros. Por cierto, adjunto el archivo ".pas" por si quieren echar un vistazo a este "TBuscadorTextoArchivos" que es el culpable de que halla escrito esto. Además de que ha sido un placer, dirigiéndose a quien va dirigido. * Nota: Pueden ver el "componente" en funcionamiento en XEditor * Otra nota: Gracias de antemano y disculpen todo este rollo. Actualización: he actualizado el archivo adjunto para incluir un mensaje y aun algo más para el usuario en caso de producirse cierta excepción utilizando el componente. Lo noto aquí para que quien lo descargara antes vea que he preferido hacerlo de este otro modo, aprovechando la revisión del componente que he hecho para tratar el tema aquí. Última edición por dec fecha: 25-07-2005 a las 23:47:43. Razón: (Actualizar el archivo adjunto) |
#2
|
||||
|
||||
No creo que sea conveniente cargar el archivo en memoria para buscar un fragmento, por otro lado recuedo hace unos años haber bajado unas librerías desarrolladas en Delphi con fuentes para este fin. Te recomiendo buscar en torry.net o en delphipages.com... de uno de estos sitios la tengo que haber bajado!
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
||||
|
||||
Hola,
¿Ni siquiera si en lugar de utilizar una variable de tipo "TStringList" utilizáramos una de tipo "TextFile" o tal vez "TFileStream"? En todo caso miraré por esas librerías que mencionas. Pero me queda un escrúpulo: ¿porqué no me parece que funcione mal, sino todo lo contrario, o casi? ¿Cómo se debería notar el excesivo consumo de memoria? Tengo entendido que no debo fiarme del administrador de tareas de Windows, puesto que si lo hiciera, en este caso, no noto que se consuma una memoria fuera de lo normal mientras se busca el texto en los archivos... y el uso del procesador es más o menos razonable... (*) ¿Qué problemas, por ende, puede ocasionar el cargar los archivos de esa manera y porqué no se advierte en la ayuda de Delphi sobre algún tipo de limitación en el uso de las funciones "Pos" y "PosEx"? Estas últimas preguntas no van dirigidas a nadie en especial, que conste (*) ¿Quizás es que en ordenadores menos potentes o con menos memoria pudiera ser una calamidad el consumo de recursos? Mi ordenador es un AMD a 1000 Mhz con 256 MB de memoria RAM. Desde luego no es un Pentium 100... Última edición por dec fecha: 25-07-2005 a las 21:00:52. Razón: (corrección del texto) |
#4
|
|||
|
|||
Cita:
No puedes presuponer que los archivos van a caber en memoria, si alguien sin querer se pone a buscar en una carpeta que este llena de archivos de video, estos seguramente no van a caber en memoria. En cuanto a que no se indique la limitacion en las funcioes Pos y PosEx, no es algo que se deba indicar porque no es una limitacion de las funciones, es una limitacion de memoria ram simplemente, las funcioes Pos y PosEx funcionaran igual sea cual sea el tamaño del archivo (siempre claro que previamente lo puedas cargar y quepa entero en la memoria). Saludos |
#5
|
||||
|
||||
Hola,
Cita:
Cita:
Actualización: Dicho y hecho: no se cargarán archivos que superen los 2 MB de tamaño. Considero esta cifra suficiente para lo que se pretende, si bien un tanto a bote pronto. Última edición por dec fecha: 25-07-2005 a las 23:38:14. Razón: (corrección del texto) |
|
|
|