Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2017
cozina cozina is offline
Miembro
 
Registrado: mar 2008
Posts: 18
Poder: 0
cozina Va por buen camino
Encontrar cadena de texto en fichero de texto

Hola, necesito saber si una cadena de texto está en un fichero de texto, pero con un condicionante, pongo un ejemplo:
Un fichero de texto:
Código:
Bello, hermoso, guapo,lindo,
agraciado; precioso, horrendo, 
coqueto, feo,horrible, etc.
Quiero saber si existe la palabra OSO, y efectivamente existe.
Código:
Bello, hermoso, guapo,lindo,
agraciado; precioso, horrendo, 
coqueto, feo,horrible, etc.
Sin embargo, necesito que sean palabras completas, no trozos de palabras, debería decirme que existe la palabra OSO solamente si está "sola", ejemplo:
Código:
Bello, hermoso, guapo,lindo,
agraciado;oso, precioso, oso horrendo, 
oso,coqueto, feo,horrible, etc.
Aparece tres veces:
Código:
Bello, hermoso, guapo,lindo,
agraciado;oso, precioso, oso horrendo, 
oso,coqueto, feo,horrible, etc.
Las palabras pueden estar separadas por espacio, coma, punto y coma, dos puntos o por nada si es la primera de la línea.
He estado viendo algo sobre el Levenshtein distance, pero me parece que es muy lento, y para el caso que lo necesito son miles de ficheros con miles de líneas.
¿Conocéis algún método rápido y funcional?
Gracias.

Última edición por Casimiro Notevi fecha: 11-06-2017 a las 19:48:51. Razón: Poner etiquetas.
Responder Con Cita
  #2  
Antiguo 12-06-2017
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola cozina,

Una forma de realizar este tipo de busquedas es a traves de expresiones regulares

prueba esta funcion simple, que solo devuelve si existe una determinada palabra completa


Código Delphi [-]
uses  System.RegularExpressions;

const
  texto:string=
    'Bello, hermoso, guapo,lindo, '+
    'agraciado;oso, precioso, oso horrendo, '+
    'oso,coqueto, feo,horrible, etc.';

function EncontrarPatron(const texto, buscar:String):boolean;
var
  RegExp:TRegEx;
  MiPatron:string;
begin
  MiPatron:='(?msi)(\W|^)'+buscar+'(\W|$)';
  RegExp := TRegEx.Create(MiPatron);
  result:=RegExp.Match(texto).Success;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if EncontrarPatron(texto, 'oso') then
    MessageDlg('cadena encontrada', mtInformation, [mbOK], 0)
  else
    MessageDlg('cadena no encontrada', mtError, [mbOK], 0);
end;

Espero te pueda servir,
Un Saludo
Responder Con Cita
  #3  
Antiguo 13-06-2017
cozina cozina is offline
Miembro
 
Registrado: mar 2008
Posts: 18
Poder: 0
cozina Va por buen camino
Gracias por tu ayuda, he estado probando y funciona medianamente bien, es que son muchos ficheros y algunos bastantes grandes. Pero es soportable
Saludos.
Responder Con Cita
  #4  
Antiguo 14-06-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

No dispongo del método Match y no pude hacer comparativas, pero fijate si obtenes alguna mejora de este modo:
Código Delphi [-]
function ExistsWord(wd: string; Text: string; Separators: array of Char;
  const CaseSensitive: Boolean = True): Boolean;
var
  SEP   : set of Char;
  c1,c2,l : Integer;
begin
  SEP    := [];
  for c1 := Low(Separators) to High(Separators) do SEP := SEP + [Separators[c1]];

  if not CaseSensitive then
  begin
    wd   := UpperCase(wd);
    Text := UpperCase(Text);
  end;

  Text   := Separators[Low(Separators)] + Text + Separators[Low(Separators)];
  Result := False;  
  c1     := 1;
  c2     := 1;
  l      := Length(wd);

  while not Result and ( c1 < Length(Text) )  do
  begin
    if Text[c1] <> wd[c2] then
      c2 := 1
    else if c2 < l then Inc( c2 );
    if c2 = l then
      Result := ( Text[c1 - l] in SEP) and (Text[c1 + 1] in SEP);      
    Inc(c1);
  end;
end;

Un ejemplo de uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
  FLG = MB_YESNO + MB_ICONQUESTION;
var
  TS: TStrings;
  fName,Wd: string;
begin
  Wd    := 'oso';
  fName := 'ARCHIVO.TXT';

  TS := TStringList.Create;
  try
    TS.LoadFromFile( fName );
    if MessageBox( 0,'Archivo cargado, ¿ Comienzo la búsqueda ?','', FLG ) = IDYES then
      if ExistsWord( wd, TS.Text, [' ',',',';',':',#10,#13] ) then
        ShowMessage( 'Palabra encontrada' )
      else
        ShowMessage( 'Palabra no encontrada' );
  finally
    TS.Free;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-06-2017 a las 04:40:19.
Responder Con Cita
  #5  
Antiguo 14-06-2017
cozina cozina is offline
Miembro
 
Registrado: mar 2008
Posts: 18
Poder: 0
cozina Va por buen camino
Funciona muy bien y es bastante rápido.
Muchas gracias
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Encontrar valor maximo de un texto mixto wilcg SQL 8 20-08-2014 18:40:09
Abrir fichero de texto y reemplazar cadena ZayDun Varios 5 06-05-2012 22:39:14
Encontrar texto intermedio en un DBGrid Oscar Guzmán OOP 7 19-03-2012 07:36:17
insertar texto en cadena de texto sabueso1010 Varios 4 27-10-2011 19:54:11
texto en un MEMO ...encontrar comparar sakuragi OOP 4 27-02-2004 18:24:28


La franja horaria es GMT +2. Ahora son las 10:33:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi