Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recorrer y Reemplazar Texto en txt (https://www.clubdelphi.com/foros/showthread.php?t=62944)

agustibaldo 22-01-2009 15:22:58

Recorrer y Reemplazar Texto en txt
 
Estimados amigos de ClubDelphi, en esta oportunidad les solicito vuestra generosa y siempre desinteresada ayuda, por un problema que necesito resolver. He buscado en los diferentes hilos pero no he podido encontrar respuesta a mi cuestión, la cual paso a plantearles.

Tengo un archivo .txt que selecciono mediante un OpenDialog, y obtengo su respectiva ruta.

A grandes rasgos, la estructura del archivo es la siguiente:

Código:


2 1/12/200802901A000100078171    1/12/2008    3518.0533061239322919217517864111000000000000      598.21          21.250      71.22000000000000      71.22009
2 1/12/200802901A000300006520    1/12/2008    1447.8933061518885519217446929111000000000000      246.20          21.250      29.31000000000000      29.31009
2 1/12/200802901A000300006521    1/12/2008    1471.2832024291855010420077637111000000000000      250.18          22.500      29.78000000000000      29.78001
2 2/12/200802901A000100078178    2/12/2008    2063.7433061915921310610068665111000000000000      350.92          22.500      41.77000000000000      41.77001
2 2/12/200802901B000300003292    2/12/2008    1909.7033063058073710440014814311000000000000      177.45          22.500      42.25000000000000      42.25001

Una vez realizado esto, debo recorrer todas las lineas del txt y reemplazar (en una determinada ubicación) el texto 21.250 por 22.250, los cuales se encuentran en la posición 117 a 123.

Espero me puedan dar una mano con esta cuestión, y sepan disculpar si este tema fue tratado con anterioridad.

Saludos a todos.

coso 22-01-2009 15:28:16

Hola, creo que puedes hacerlo de manera sencilla usando la propiedad .text de un TStringList (lo hago de cabeza, deberas probarlo)

Código Delphi [-]
var
   ss : TStringList;
begin
    ss := TStringList.Create;
    ss.LoadFromFile('c:\archivo.txt');
    ss.Text := StringReplace(ss.text,'22.150 ','22.250 ',[rfReplaceAll]);
    ss.SaveToFile('c:\archivo.txt');
end;

saludos.

felipe88 22-01-2009 15:57:01

Sino te gusta la idea del compañero [coso] puedes probar la función copy,
Saludos :)

agustibaldo 22-01-2009 17:32:37

Desde ya, muchas gracias por sus respuestas.

[coso] he probado lo que me pasaste y funciona de maravillas.

Pero todavía me queda una duda: al realizarlo de la manera que planteas no estoy reemplazando todos las cadenas que comiencen con '22.150' en el total del texto? Porque de ser así, esto no cumpliría con lo que necesita que es, precisamente, reemplazar el texto antes mencionado pero dandole una posición (del 118 al 123) linea por linea.

Me parece que en este caso, sería mejor usar la función copy, la cual puede asignarle la posición a cambiar. Pero la pregunta es: como hago para recorrer linea por linea?

En fin, espero haber sido claro con mi explicación, caso contrario no duden en consultarme.

Nuevamente, muchas gracias por sus respuestas.

Chris 22-01-2009 18:12:04

Cita:

Empezado por agustibaldo (Mensaje 335540)
..al realizarlo de la manera que planteas no estoy reemplazando todos las cadenas que comiencen con '22.150' en el total del texto? ...

Sí, Estas modificando cualquier cadena que empieze con 22.150.

Mejor utiliza una compinación de copy y StuffString
Código Delphi [-]
var
   ss : TStringList;
I: integer;
begin
    ss := TStringList.Create;
    ss.LoadFromFile('c:\archivo.txt');
    //ss.Text := StringReplace(ss.text,'22.150 ','22.250 ',[rfReplaceAll]);
    
for I := 0 to (ss.count -1) do
if sametext(copy(ss.strings[i], 117, length('21.250')), '21.250') then 
  ss.strings[i] := StuffString('21.250', 117, length('21.250'), '22.250');


ss.SaveToFile('c:\archivo.txt');
end;
Saludos.

Caro 22-01-2009 18:18:15

Cita:

Empezado por agustibaldo (Mensaje 335540)
Desde ya, muchas gracias por sus respuestas.

[coso] he probado lo que me pasaste y funciona de maravillas.

Pero todavía me queda una duda: al realizarlo de la manera que planteas no estoy reemplazando todos las cadenas que comiencen con '22.150' en el total del texto? Porque de ser así, esto no cumpliría con lo que necesita que es, precisamente, reemplazar el texto antes mencionado pero dandole una posición (del 118 al 123) linea por linea.

Me parece que en este caso, sería mejor usar la función copy, la cual puede asignarle la posición a cambiar. Pero la pregunta es: como hago para recorrer linea por linea?

En fin, espero haber sido claro con mi explicación, caso contrario no duden en consultarme.

Nuevamente, muchas gracias por sus respuestas.

Hola, haciendo así directo si te va ha reemplazar todo, para recorrer línea lía solo es recorrer el StrinList y paar buscar desde una posición determinada y ver si existe puedes utilizar PosEx y paar reemplazar el StringReplace sin opciones en el ultimo parametro solo para que te reemplace la primera ocurrencia.

Mas o menos tu codigo quedaría así:
Código Delphi [-]
 sl:= TStringList.Create;
 .......................
 for i:=0 to sl.count-1 do
  begin  
   Ind := PosEx(sl[i], '21.250', 117); 
   if Ind > 0 then
    begin
     StrIzq := Copy(sl[i], 1, Ind-1);
     StrDer := Copy(sl[i], Ind, Length(sl[i]));

     StrDer := StringReplace(StrDer,'21.250','22.250 ',[]);
 
    sl[i] := strIzq+' '+StrDer;
    end;
  end;

Así sería mas o menos, hay varias formas de hacerlo, esa es una.

Saluditos

Caro 22-01-2009 18:33:55

Hola de nuevo, no conocía la función StuffString, en vez de separar la cadena o utilizar Delete e Insert, mejor que utilices StuffString con la función PosEx.

Código Delphi [-]
for i:=0 to sl.count-1 do
  begin  
    if PosEx(sl[i], '21.250', 117) > 0 then
      sl[i] := StuffString('21.250', 117, Length('21.250'), '22.250');
  end;

Saluditos

Chris 22-01-2009 18:37:26

Caro, tu código contiene un bug, en la línea
Cita:

Ind := PosEx(sl[i], '21.250', 117);
ya que esto también podrá confundir cadenas que contengan '21.250' a pesar de que se encuentren luego de la posición 123.

Estás ofuscando código? ;)

Saludos.

agustibaldo 22-01-2009 19:23:41

D&W he probado tu sugerencia pero me produce un resultado diferente al que daba de entrada, que te muestro a continuación:

Código:

1.2502.500
1.2502.500
2 1/12/200802901A000300006521    1/12/2008    1471.2832024291855010420077637111000000000000      250.18          22.500      29.78000000000000      29.78001
2 2/12/200802901A000100078178    2/12/2008    2063.7433061915921310610068665111000000000000      350.92          22.500      41.77000000000000      41.77001
2 2/12/200802901B000300003292    2/12/2008    1909.7033063058073710440014814311000000000000      177.45          22.500      42.25000000000000      42.25001
1.2502.500
2 3/12/200802901A000300006542    3/12/2008    1319.5432720146028510740029451111000000000000      174.89          22.500      27.92000000000000      27.92001
1.2502.500
1.2502.500
2 4/12/200802901A000300006561    4/12/2008    1203.0832714455479010510192048111000000000000      111.79          22.500      26.62000000000000      26.62001
2 4/12/200802901A000300006563    4/12/2008    2216.4432029524693710410263259111000000000000      205.95          22.500      49.03000000000000      49.03001
2 4/12/200802901A000300006567    4/12/2008    1371.3032720146028510740029451111000000000000      127.42          22.500      30.34000000000000      30.34001
2 4/12/200802901B000300003307    4/12/2008    1313.0632024404084610440022138411000000000000      122.01          22.500      29.05000000000000      29.05001
2 5/12/200802901A000300006579    5/12/2008    2582.6733071079415010111372427111000000000000      239.98          22.500      57.13000000000000      57.13001

Tienes idea a que puede deberse?

Desde ya, agradezco tu respuesta.

Saludos.

Chris 22-01-2009 19:31:55

Podrías ayudarme a entender en que consisten escencialmente las diferencias, pues auque las veo, no las puedo relacionar.

coso 22-01-2009 19:42:30

si, te reemplaza todo. Si quieres solo de esas lineas, en vez de ss.text, usa ss[numero_de_linea] := stringreplace( ss[numero_de_linea],...) etc... ahora ya lo tienes en bandeja. Algo asi como

Código Delphi [-]
  for i := 123 to 223 do
   ss[i] := stringreplace(ss[i],'22.150',etc...

agustibaldo 22-01-2009 19:45:30

La diferencia que vi se encuentra en la siguiente línea:

Código:

ss.strings[i] := StuffString('1.250', 118, length('1.250'), '2.250');
Al hacer esto, agrega al primer parámetro '1.250' el reemplazo que se realiza a partir de la línea 118 (para este caso particular) entre '1.250' y '2.250'. Es por esto que en las líneas que cambiaba, transformaba de la siguiente manera:

Código:

1.2502.500
Así que el primer parámetro ('1.250') lo reemplace por ss.strings[i] y funcionó correctamente.

Agradezco nuevamente tu tiempo en darme una respuesta a mi problema.

Saludos.

agustibaldo 22-01-2009 19:50:42

Así es, lo he resuelto de esa manera.

[coso], [felipe88], D&W y Caro muchas gracias a todos por sus respuestas.

Saludos a todos.;)


La franja horaria es GMT +2. Ahora son las 07:49:56.

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