PDA

Ver la Versión Completa : Reemplazar el contenido de un fichero


Urticaria
02-10-2006, 10:36:07
Hola gente, tengo una duda. Necesito reemplazar el contenido de un fichero de texto.

Buscando un patron dentro de un string, he conseguido leer la linia del fichero, cambiar el string y escribir en el fichero, pero se me queda dos lineas la original y la modificada.

¿como puedo sustituir la cadena que busco por la modificada?.

Muchas gracias.

Neftali [Germán.Estévez]
02-10-2006, 11:51:56
¿Puedes poner el código que utilizas?
Creo que lo más sencillo es utilizar un TStrings; Cargar el fichero, reemplazar y volver a escribir, si el ficheros relativamente pequeño.

Urticaria
03-10-2006, 11:44:25
¿Puedes poner el código que utilizas?
Creo que lo más sencillo es utilizar un TStrings; Cargar el fichero, reemplazar y volver a escribir, si el ficheros relativamente pequeño.


procedure modificar (s:string);
var
f:TextFile;
c:char;
cad:string;
cadena: PAnsiChar; //Da igual "PAnsiChar" o "string".
e:boolean;

begin
cadena:='Cadena_a_buscar';
Assign (f,s);
Reset (f);

while not Eof(f) do
begin
Readln (f,cad);
if AnsiContainsStr(cad, cadena) then
begin
//Aqui hay que reemplazar en el fichero la cadena
writeln (cadena + ' esta contenido en ' + cad);
cad:= StringReplace (cad, cadena, 'Aquesto',[rfReplaceAll]);
writeln (cad);
end;
cad := EmptyStr;
end;
close(f);
end;


Aqui tienes el procedimiento, aqui lo que hago es leer del fichero, modificar la cadena. Podria escribir la cadena modificada en el fichero, pero entonces tendria las dos lineas (original y modificada) en el fichero, cosa que no quiero.

Muachas gracias.

seoane
03-10-2006, 12:58:49
Podria escribir la cadena modificada en el fichero


Lo dudo bastante, ya que cuando se utiliza el método reset para abrir un archivo de texto, este se abre como solo lectura. Yo personalmente para tratar con archivos de texto prefiero utilizar un TStringList, que hace todo mucho mas fácil.


program Project1;

{$APPTYPE CONSOLE}

uses SysUtils, Classes;

procedure Modificar(S: string);
var
Cadena: string;
begin
Cadena:= 'Cadena_a_buscar';
with TStringList.Create do
try
LoadFromFile(S);
Text:= StringReplace(Text,Cadena,'Aquesto',[rfReplaceAll]);
SaveToFile(S);
finally
Free;
end;
end;

begin
Modificar('d:\1.txt');
end.


O si prefieres ir buscando linea a linea (mucho mas lento)

program Project1;

{$APPTYPE CONSOLE}

uses SysUtils, Classes;

procedure Modificar(S: string);
var
i: integer;
Cadena: string;
begin
Cadena:= 'Cadena_a_buscar';
with TStringList.Create do
try
LoadFromFile(S);
for i := 0 to Count -1 do
if pos(Cadena,Strings[i])>0 then
begin
writeln(Cadena + ' esta contenido en ' + Strings[i]);
Strings[i]:= StringReplace(Strings[i],Cadena,'Aquesto',[rfReplaceAll]);
end;
SaveToFile(S);
finally
Free;
end;
end;

begin
Modificar('d:\1.txt');
Readln;
end.

Neftali [Germán.Estévez]
03-10-2006, 13:02:37
Un ejemplo usando TStrings sería este:


procedure Modificar2(FileName:String; StrOrig, StrNueva:string);
var
TS:TStrings;
i:Integer;
encontrada:Boolean;
begin

// ini
TS := TStringList.Create();
i := 0;
encontrada := False;

// Proteccion para liberar
try

// Cargar el fichero
TS.LoadFromFile(FileName);
// recorrido para buscar
while (i <= TS.Count - 1) do begin

// encontrada?
if AnsiContainsStr(StrOrig, TS.Strings[i]) then begin
// Cambiarla
TS.Strings[i] := StrNueva;
encontrada := True;

// Si sólo quieres buscar 1 línea que coincida descomenta la siguiente línea
i := TS.Count;
end;
// Siguiente línea
i := i + 1;
end;

// Se ha encontrado y modificado? ==> Cabiamos
if (encontrada) then begin
TS.SaveToFile(FileName);
end;

finally
FreeAndNil(TS);
end;
end;


Si le pasas el nombre del fichero, la cadena a buscar y la nueva, te sustituirá 1 o varias ocurrencias de esa cadena. Para ficheros muy grandes no creo que sea la forma más optima, pero para ficheros normales no creo que se note la deferencia.

Urticaria
04-10-2006, 16:40:18
Lo dudo bastante, ya que cuando se utiliza el método reset para abrir un archivo de texto, este se abre como solo lectura. Yo personalmente para tratar con archivos de texto prefiero utilizar un TStringList, que hace todo mucho mas fácil.

Código Delphi [-] (http://www.clubdelphi.com/foros/#)program Project1;

{$APPTYPE CONSOLE} uses SysUtils, Classes;

procedure Modificar(S: string);
var Cadena: string;
begin Cadena:= 'Cadena_a_buscar';
with TStringList.Create do try LoadFromFile(S); Text:= StringReplace(Text,Cadena,'Aquesto',[rfReplaceAll]);
SaveToFile(S);
finally Free; end;
end;

begin Modificar('d:\1.txt');
end.


O si prefieres ir buscando linea a linea (mucho mas lento)
Código Delphi [-] (http://www.clubdelphi.com/foros/#)program Project1;

{$APPTYPE CONSOLE} uses SysUtils, Classes;

procedure Modificar(S: string);
var i: integer; Cadena: string;
begin Cadena:= 'Cadena_a_buscar';
with TStringList.Create do try LoadFromFile(S); for i := 0 to Count -1 do if pos(Cadena,Strings[i])>0 then begin writeln(Cadena + ' esta contenido en ' + Strings[i]);
Strings[i]:= StringReplace(Strings[i],Cadena,'Aquesto',[rfReplaceAll]);
end;
SaveToFile(S);
finally Free; end;
end;

begin Modificar('d:\1.txt');
Readln;
end.



Me rindo ante vuestra sapiencia. Como los ficheros son pequeños me va de p... madre

Muchas gracias.