Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Reemplazar el contenido de un fichero (https://www.clubdelphi.com/foros/showthread.php?t=36082)

Urticaria 02-10-2006 10:36:07

Reemplazar el contenido de un fichero
 
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

Cita:

Empezado por Neftali
¿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.

Código Delphi [-]
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

Cita:

Empezado por Urticaria
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.

Código Delphi [-]
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 [-]
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:

Código Delphi [-]
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

Cita:

Empezado por seoane
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 [-]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 [-]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.


La franja horaria es GMT +2. Ahora son las 08:44:12.

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