Substituir palavra de um arquivo texto
:?: Estou com o seguinte problema para concluir um projeto: preciso de uma rotina para varrer um arquivo texto e que substitua uma palavra do arquivo. Ex: Se eu tenho um arquivo texto com nome de ´coisas.txt´ eu preciso ler este arquivo do inicio ao fim e substituir, por exemplo, a palavra ´banana´ por ´maça´. Eu năo preciso visualizar o arquivo. Já vi uma rotina parecida por aqui mas só funcionou em arquivos tipados. :?:
Tatuweb
Curtidas 0
Respostas
Nerdex
18/03/2004
Abaixo uma procedure que abre o arquivo.txt sem precisar vizualizá-lo, vc poderá trabalhar linha a linha deste arquivo em um looping até chegar ao fim do arquivo:
procedure percorreArquivoTexto ( nomeDoArquivo: String );
var arq: TextFile;
linha: String;
begin
AssignFile ( arq, nomeDoArquivo );
Reset ( arq );
ReadLn ( arq, linha );
while not Eof ( arq ) do
begin
{ Processe a linha lida aqui. }
{ Para particionar a linha lida em pedaços, use a funçăo Copy. }
ReadLn ( arq, linha );
end;
CloseFile ( arq );
end;
procedure percorreArquivoTexto ( nomeDoArquivo: String );
var arq: TextFile;
linha: String;
begin
AssignFile ( arq, nomeDoArquivo );
Reset ( arq );
ReadLn ( arq, linha );
while not Eof ( arq ) do
begin
{ Processe a linha lida aqui. }
{ Para particionar a linha lida em pedaços, use a funçăo Copy. }
ReadLn ( arq, linha );
end;
CloseFile ( arq );
end;
GOSTEI 0
Henry
18/03/2004
Assim, brother, vc precisa simila teu texto com um memo, pode usa uma variavel pra isso ou um Tmemo mesmo..
Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Procedure FindReplace (const Enc, subs: String; Var Texto: TMemo);
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
Um abraço, Henry.
Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Procedure FindReplace (const Enc, subs: String; Var Texto: TMemo);
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
Um abraço, Henry.
GOSTEI 0
Mauricio Gabriel
18/03/2004
Assim, brother, vc precisa simila teu texto com um memo, pode usa uma variavel pra isso ou um Tmemo mesmo..
Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Procedure FindReplace (const Enc, subs: String; Var Texto: TMemo);
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
Um abraço, Henry.
Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Procedure FindReplace (const Enc, subs: String; Var Texto: TMemo);
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
Um abraço, Henry.
OLÁ Henry, gostei bastante de sua soluçăo .
porém estou com um problema similar.
Seria possível me ajudar
meu cenário é o seguinte , tenho um txt (em formato exportado pela impressora zebra)
e tem alguns caracteres especiais dentro dele ... e por isso năo carrega no memo.
Teria como fazer uma rotina assim.
1) abrir arquivo txt Origem
2) substituir varias palavras dentro desse txt
3) Salvar esse arquivo com outro nome.
segue o que estou tentando fazer .
//// Delphi
procedure TForm1.Button1Click(Sender: TObject);
var
Arq : TStringList ;
const
ARQUIVO = 'C:\\TEMP\\00000-FF_Etiqueta_Resfriada.PRN';
ARQDEST = 'C:\\TEMP\\PRINT.PRN';
begin
Arq := TStringList.Create;
try
Arq.LoadFromFile(ARQUIVO);
Arq.Text := StringReplace(Arq.Text,'[VAR_DESCRICAO_PRODUTO]','"PEIXE RESFRIADO - FILÉ DE TILAPIA SEM PELE"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_PESO_LIQUIDO]','"15,000"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_PESO_BRUTO]','"15,060"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_DT_FABRICACAO]','"24/10/2022"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_NUM_LOTE]','"000164"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_DT_VALIDADE]','"10/10/2025"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_SISP]','"1694/00101"', [rfreplaceAll]);
Arq.Text := StringReplace(Arq.Text,'[VAR_CODIGO_PRODUTO]','"123456789147852369"', [rfreplaceAll]);
finally
Arq.SaveToFile(ARQDEST);
Arq.Free;
end;
close;
end;
porém também năo esta dando certo, porque na propriedade Arq.Text , ele năo carrega tudo , apenas parte do txt , igualzinho ocorreco com o memo.
veja o conteúdo do arquivo txt
I8,A,001
Q799,024
q831
rN
S3
D5
ZT
JF
OD
R16,0
f100
N
GW42,645,42,128,˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ăüŕ˙ř?Áţđüŕř
ele só carrega isso acima ... năo carrega mais.
queria upar o arquivo aqui ... mas năo encontrei como ... se puder me ajudar passando seu e-mail eu lhe envio ...
antecipo cordial agradecimento.
GOSTEI 0