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 22-01-2009
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 22-01-2009
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 22-01-2009
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 18
felipe88 Va por buen camino
Sino te gusta la idea del compañero [coso] puedes probar la función copy,
Saludos
Responder Con Cita
  #4  
Antiguo 22-01-2009
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 22-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 18
Chris Va por buen camino
Cita:
Empezado por agustibaldo Ver Mensaje
..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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 22-01-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por agustibaldo Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 22-01-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 22-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 18
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #9  
Antiguo 22-01-2009
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 22-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 18
Chris Va por buen camino
Podrías ayudarme a entender en que consisten escencialmente las diferencias, pues auque las veo, no las puedo relacionar.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #11  
Antiguo 22-01-2009
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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...
Responder Con Cita
  #12  
Antiguo 22-01-2009
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 22-01-2009
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
Así es, lo he resuelto de esa manera.

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

Saludos a todos.
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
Reemplazar texto Caro Varios 5 19-01-2009 23:55:29
Reemplazar texto en un textfile.. rulo_m Varios 4 10-06-2008 03:12:41
Reemplazar texto en un .dfm elcigarra OOP 9 19-12-2007 09:47:17
Reemplazar texto de encabezamiento y pie toni.vi Servers 2 16-10-2007 11:36:50
Reemplazar texto en fichero HTML Sr_Sombrero Varios 1 17-04-2007 20:01:50


La franja horaria es GMT +2. Ahora son las 10:24:48.


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