Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Busqueda de cadenas en ficheros de texto

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Alguien me podría orientar como podría buscar una cadena expecífica en un fichero de texto, ¿hay alguna función para buscar?
o tengo que ir mirando caracter por caracter todo el fichero.

Gracias por leer el mensaje

Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Eso se puede hacer de muchas maneras, aunque yo no te aconsejo que uses un TMemo si vas a usar archivos binarios o archivos muy gandes.
Lo mas sencillo es leer bloques del fichero y buscar en ellos la cadena usando la funcion strstr.
Una ejemplo podria ser el siguiente:

long BuscaTexto(char NombreArchivo[], char CadenaBuscada[])
// Funcion que devuelve el numero de bloque donde esta la cadena que buscamos. (1 Bloque = 255 bytes).
{
FILE *Archivo;
long Bloque, LongitudArchivo;
char Buffer[255];

if((Archivo = fopen(NombreArchivo, "rb")==NULL)){
// No se pudo abrir el fichero.
sprintf(Buffer, "\nNo se pudo abrir el fichero '%s'\n", NombreArchivo);
ShowMessage(Buffer);
return(-1);
}
LongitudArchivo = filelength(fileno(Archivo));
Bloque = -1;
while(LongitudArchivo >= 255){
//Leemos un bloque de 255 bytes.
fread(Buffer, 255, 1, &Archivo);
LongitudArchivo = (LongitudArchivo - 255);
Bloque++;
if(strstr(Buffer, CadenaBuscada)){
// Hemos encontrado la cadena.
return(Bloque);
}
}
if(LongitudArchivo > 0){
// Quedan menos de 255 bytes a leer.
fread(Buffer, LongitudArchivo, 1, &Archivo);
Bloque++;
if(strstr(Buffer, CadenaBuscada)){
// Hemos encontrado la cadena.
return(Bloque);
}
}
return(-1);
}

Espero que sea lo que estabas buscando.

Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

La verdad no sé ...
Lo que se me ocurre a mí es cargar el archivo de texto en un contenedor tipo TMemo o tipo TRichEdit...
Y ya de ahí tratar con la propiedad Text de ambos componentes(Objetos)...
Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Gracias J.B. era lo que buscaba
Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Interesante tu respuesta...
No he probado el código...
Solo por curiosidad...
Que pasa si se atrapa solo un pedazo de la cadena que si está completamnete?

Ejemplo:
que en el texto esté la cadena...
Cadena1
y que por alguna razón se obtenga Cad...

Hmmm

joseluisbz@bigfoot.com

Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Hola chicos,
como un umilde aporte a la confución general, permítanme coincidir con joseluisbz.
Me explico:
Supongamos que la cadena buscada tiene 10 caracteres, ubicados desde el caracter 250 hasta el 259. En este caso, leer y transferir bloques de 255 bytes no permite encontrarla.
Otra opción:
1- Leer el archivo byte a byte, hasta encontrar el primer caracter de la cadena buscada.
2- leer los sizeof(cadena) siguientes y compararlos con la cadena.
2.a - Si se encontró la cadena, bien; incluso se puede ir por otra igual.
2.b - Si no es ésta, a buscar de nuevo (1)


Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Hola, otra opción, una función de busqueda que aprovecha la proyección de archivos en memoria de Windows, es bastante rápida y permite trabajar con archivos muy grandes. Aunque aun hay que probarla un poco mas, de momento la he probado mientras la estaba haciendo y no me ha dado problemas, eso si, solo la he podido probar en Win2000 (se agradecen comentarios si alguien la prueba en otras versiones de Windows).

Bueno, aquí va la función:
(hay que añadir: #include <string.h> (por 'strlen'))

code:

// Entrada:
// szFile = Path del fichero donde se va a buscar
// szText = La cadena que queremos buscar
// Salida:
// devuelve la posición dentro del fichero donde se
// encontro la cadena o 0 en caso de no encontrarla
// (NOTA: la primera posición es 1)
int FindTextInFile(const char *szFile, const char *szText)
{
// Abre el fichero
HANDLE hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
// Lo proyecta en memoria
HANDLE hMap = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0);
if (hMap)
{
LPVOID lpFileView = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
if (lpFileView)
{
char *szFileBuff = (char*)lpFileView;
int FileSize = GetFileSize(hFile, NULL);
int i, j, LengthText = strlen(szText);
for (i=0; i<FileSize; i++)
{
// Busca el primer caracter
if ((szFileBuff[i]==szText[0]) && (i+LengthText<=FileSize))
{
// Los siguientes
for (j=1; j<LengthText; j++)
if (szFileBuff[i+j] != szText[j])
break;
// Encontrado!!, rompe el bucle
if (j == LengthText)
break;
}
}
if (i < FileSize)
return i+1;
UnmapViewOfFile(lpFileView);
}
CloseHandle(hMap);
}
CloseHandle(hFile);
}
return 0;
}

Y el modo de uso, por ejemplo:

  int i = FindTextInFile("c:\\MiFichero.txt", "frase a buscar");
  if (i)
ShowMessage("Encontrado!! Pos=" + IntToStr(i));
  else
      ShowMessage("No se encontro.");


Espero que te sea útil.
Saludos.

Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Que pasa no os gusta la orientación a objetos (solo si es fichero de texto)?
TStringList *fichero;
fichero= new TStringList;
fichero->LoadFromFile("nota.txt");
if (fichero->Text.AnsiPos("estoy")!=0)
ShowMessage("cadena encontrada");

delete fichero;

Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Me he dado cuenta que richedit tiene un metodo para buscar cadenas
RichEdit1->FindText("texto", StartPos, ToEnd, TSearchTypes()<< stMatchCase);
Mira la ayuda para mas informacion
Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Si, es mucho mas sencillo hacerlo asi, solo hay un problema, que estamos cargando el archivo completo en memoria cada vez, y bien esto no esta mal cuando son archivos pequeños, pero si tenemos archivos grandes y tenemos que buscar en varios, la diferencia de velocidad se notara bastante.
Volver arriba
Mensaje    Asunto: Busqueda de cadenas en ficheros de texto Responder citando

Vaya, pues si que ha tenido exito mi respuesta.... me voy unos dias y mira la que he montado.

Respecto a lo de busquedas de subcadenas en cadenas... pues si, obviamente el metodo de busqueda no esta muy depurado que se diga, pero el codigo lo escribí directamente como respuesta de la pregunta, y no lo he probado, aunque supongo que funcionara bien. Ese mismo problema lo tendremos si queremos buscar cadenas con una longitud mayor de 255 caracteres. Seria cuestion de depurar un poco el codigo, nada más.
Ademas, el codigo es 100% C, nada de APIs ni uso de controles, lo cual puede ser una ventaja o problema... segun se mire.

Y como siempre, todo se puede hacer de multitud de formas, y seguro que cada programador enfoca el problema de distinta manera... es lo que más me gusta de la programación.

Saludos.

Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.