Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminar palabras de un documento (https://www.clubdelphi.com/foros/showthread.php?t=50143)

ZayDun 09-11-2007 12:07:32

Eliminar palabras de un documento
 
hola compañeros,tengo un documento de texto con cientos de palabras pero algunas tienen mas de 10 caracteres y me gustaria eliminarlas de la lista pero estoy buscando la forma de como poder eliminar ya que son muchas. GRACIAS!

dec 09-11-2007 12:20:47

Hola,

Una pregunta. ¿Realmente hablamos de una lista? Es decir, ¿podemos encontrar "elementos" de una lista o encontramos las palabras en un texto separadas por espacios, por ejemplo?

Dicho de otro modo, tenemos esto:

Código:

Hola
Que
Tal
Estas
Contigo

O tenemos algo así:

Código:

Hola Que Tal Estas Contigo
Y otra cosa más, ¿de dónde salen las palabras? ¿Las recoges de un archivo? ¿Las tienes en alguna cadena? ¿Tal vez en otro tipo de variable como pudiera ser "TStrings"?

ZayDun 09-11-2007 12:26:46

Hola Dec, lo que tenemos es una lista de palabras tipo:

Código:

lista
de
palabras
...
..


dec 09-11-2007 12:29:58

Hola,

Pero las tendréis en algún sitio, en algún tipo de variable... ¿las cargáis de un archivo? ¿Cómo lo hacéis?

ZayDun 09-11-2007 12:35:03

La palabras se encuentra en un txt que se carga en un memo para mostrarlas, despues el programa realiza busqueda en ese memo pero las que tienen mas de 10 caracteres no son validas, asi que quiero eliminarlas para que la busquedad sea mas rapida. Saludos!

Neftali [Germán.Estévez] 09-11-2007 12:50:50

Haz un recorrido y las que tengan más de 10 caracteres de longitud las borras. ¿Qué dificultad tiene eso?

Para el recorrido haz un for (Descendente, no ascendente) y para eliminarlas usa el Delete de TStrings (memo.Lines).

dec 09-11-2007 12:51:48

Hola,

A bote pronto se me ocurre algo parecido a esto:

Código Delphi [-]
(*
  Carga un archivo existente e itera por sus líneas para
  rechazar aquellas que superen la longitud deseada.

  Si el archivo especificado no existe este procedimiento
  levantará una excepción del tipo "EInOutError"

  Ejemplo de llamada:

  var
    t: TStrings;
  begin
    t := TStringList.Create();
    try
      GetWordsFromFile('palabras.txt', 2, t);
      Memo1.Text := t.Text;
    finally
      t.Free();
    end;
  end;

  Parámetros:

  filePath: Ruta del archivo a cargar

  maxChars: Máximos caracteres para no rechazar una línea

  resultsWords: Variable donde se albergará el resultado,
  es decir, las líneas cargadas del archivo no rechazadas

*)
procedure GetWordsFromFile(filePath: string;
 maxChars: integer; var resultsWords: TStrings);
var
  i: integer;
begin
  if FileExists(filePath) then begin
    resultsWords.LoadFromFile(filePath);
    for i := resultsWords.Count-1 downto 0 do
    begin
      if (Length(resultsWords[i]) > maxChars) then
      begin
        resultsWords.Delete(i);
      end;
    end;
  end
  else begin
    raise EInOutError.CreateFmt(
      'The file "%s" dont exists',
      [filePath]
    );
  end;
end;

No sé si puede servirte o darte al menos una idea. :)

PD. Básicamente es lo que dice el compañero Neftalí, si bien en este caso no se desechan las palabras del "Memo", sino que no llegan a cargarse en el mismo.

Neftali [Germán.Estévez] 09-11-2007 13:02:12

Cita:

Empezado por dec (Mensaje 244812)
PD. Básicamente es lo que dice el compañero Neftalí, si bien en este caso no se desechan las palabras del "Memo", sino que no llegan a cargarse en el mismo.

Básicamente esta solución es mejor, por que las que no valen ya nos las añades.:D
Mi solución (que estoy un poco perro hoy y era por no escribir) las descarta luego, por lo que estás haciendo trabajo de más....

dec 09-11-2007 13:07:45

Hola,

Bueno, no sé. No lo tengo tan claro. :)

En primer lugar, el procedimiento propuesto lo escribí a bote pronto, y, es muy probable que existan mejores soluciones. Ahora bien, cargar las palabras, hemos de hacerlo, bien directamente en el "Memo", o no, pero, ese paso hay que darlo.

Yo evité cargarlas antes en una variable y luego asignar dicha variable al "Memo" porque tal vez el recorrer y borrar las palabras una vez dentro de este, pudiera "saltar a la vista" del usuario, que están a la que salta, no sé si me explico. ;)

Mick 09-11-2007 15:27:08

Cita:

Empezado por dec (Mensaje 244815)
Hola,
Yo evité cargarlas antes en una variable y luego asignar dicha variable al "Memo" porque tal vez el recorrer y borrar las palabras una vez dentro de este, pudiera "saltar a la vista" del usuario, que están a la que salta, no sé si me explico. ;)

Tenemos el metodo BeginUpdate, que evita que salten los eventos de redibujado, modificacion, etc, evitando el problema visual y ademas acelerando muchisimo las modificaciones:

Código Delphi [-]
Memo1.Lines.BeginUpdate;
try
  //
  // Añadir, modificar o borrar lineas del memo.
  //
finally
  Memo1.Lines.EndUpdate;
end;

Saludos

dec 09-11-2007 15:30:31

Hola,

Sí; gracias Mick. Efectivamente, existe "BeginUpdate", aunque, no probé con él. Pero podría servir, así es. :)


La franja horaria es GMT +2. Ahora son las 14:52:39.

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