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 02-10-2006
Urticaria Urticaria is offline
Registrado
 
Registrado: sep 2006
Posts: 5
Poder: 0
Urticaria Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 02-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 03-10-2006
Urticaria Urticaria is offline
Registrado
 
Registrado: sep 2006
Posts: 5
Poder: 0
Urticaria Va por buen camino
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.

Última edición por dec fecha: 03-10-2006 a las 12:55:44.
Responder Con Cita
  #4  
Antiguo 03-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 03-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 04-10-2006
Urticaria Urticaria is offline
Registrado
 
Registrado: sep 2006
Posts: 5
Poder: 0
Urticaria Va por buen camino
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.
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
Obtener un fichero adjunto a un nodo de un fichero XML muntasil Internet 0 18-07-2006 13:57:57
Cifrar el contenido de un fichero D@byt Varios 3 30-05-2005 17:13:01
Pasar contenido fichero a un campo memo Jose Manuel Impresión 2 15-03-2005 17:39:59
Problemas al cargar el contenido de un fichero en un ListBox Delphos Varios 4 02-02-2004 14:02:07
recorrer un fichero e ir guardando su contenido guantxo Varios 5 17-07-2003 10:34:15


La franja horaria es GMT +2. Ahora son las 12:39: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
Copyright 1996-2007 Club Delphi