Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Encontrar cadena de texto en fichero de texto (https://www.clubdelphi.com/foros/showthread.php?t=91957)

cozina 11-06-2017 18:44:31

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.

bucanero 12-06-2017 10:06:56

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

cozina 13-06-2017 22:11:29

Gracias por tu ayuda, he estado probando y funciona medianamente bien, es que son muchos ficheros y algunos bastantes grandes. Pero es soportable :)
Saludos.

ecfisa 14-06-2017 03:59:29

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 :)

cozina 14-06-2017 12:06:30

Funciona muy bien y es bastante rápido.
Muchas gracias :)


La franja horaria es GMT +2. Ahora son las 07:36:42.

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