Substituir várias palavras de um arquivo .txt

Delphi

28/10/2022

Boa tarde !!!
Meu cenário é o seguinte , tenho um txt (em formato exportado para ser utilizado na impressora zebra)
e tem alguns caracteres especiais dentro dele ... e por isso não carrega total , .

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 .



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 componente Tmemo.
não aquei onde colocar esse arquivo txt em anexo aqui ... mas vou colocar ele abaixo.

https://drive.google.com/file/d/1y92DynhiEGG-KdoXhK8z1ve9IQr4Tbl9/view?usp=share_link

se puderem me ajudar , eu antecipo cordial agradecimento.
Mauricio Gabriel

Mauricio Gabriel

Curtidas 0

Melhor post

Mais Respostas

Mauricio Gabriel

Mauricio Gabriel

28/10/2022



bom dia ... olá Raimundo Pereira ... Muito obrigado por sua contribuição , mas já havia tentado fazer isso , o problema não é o código EPL em sí , que já domino , o problema é a imagem , que ao transformar ele em arquivo .txt , ele se torna um código incompreensível , e inviável para montar na unha para etiqueta...

https://drive.google.com/file/d/1y92DynhiEGG-KdoXhK8z1ve9IQr4Tbl9/view?usp=share_link

veja o arquivo no link em anexo .....

se não fosse essa imagem , a linguagem já consegui dominar e até imprimir ....
por isso havia sugerido

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.

se puder ajudar-me dessa forma eu agradeço desde já.


GOSTEI 0
Mauricio Gabriel

Mauricio Gabriel

28/10/2022

Bom dia amigos ... com a Ajuda de outro amigo , consegui resolver o problema ... ficou assim conforme abaixo. apenas adaptei a minha necessidade ... Obrigado a todos....
me perdoe ... não sei como fechar este tópico , ou dar como [Resolvido]... alguém poderia me ajudar por favor.


procedure TForm1.Button1Click(Sender: TObject);
var
Arq1, Arq2: TextFile;
t: String;
const
ARQUIVO = 'C:\\TEMP\\00000-FF_Etiqueta_Resfriada.PRN';
ARQDEST = 'C:\\TEMP\\PRINT.PRN';
begin
Assign(Arq1, Arquivo);
Reset(Arq1);
Assign(Arq2, ArqDest);
Rewrite(Arq2);
repeat

ReadLn(t, Arq1);

t := StringReplace(t, '[VAR_DESCRICAO_PRODUTO]','"PEIXE RESFRIADO - FILÉ DE TILAPIA SEM PELE"', [rfreplaceAll]);
t := StringReplace(t,'[VAR_PESO_LIQUIDO]','"15,000"', [rfreplaceAll]);
...

WriteLn(Arq2, t);

until Eof(Arq1);

CloseFile(Arq1);
CloseFile(Arq2);
end;
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

28/10/2022

O arquivo PRN não é um arquivo texto. Ele contém caracteres de controle e, por isso, você não conseguirá utilizar o TStringList.

O outro exemplo utilizando TextFile não vai funcionar pelo mesmo motivo.

O arquivo é do tipo binário e pode não ser tão simples modificar o seu conteúdo.
GOSTEI 1
Mauricio Gabriel

Mauricio Gabriel

28/10/2022

O arquivo PRN não é um arquivo texto. Ele contém caracteres de controle e, por isso, você não conseguirá utilizar o TStringList.

O outro exemplo utilizando TextFile não vai funcionar pelo mesmo motivo.

O arquivo é do tipo binário e pode não ser tão simples modificar o seu conteúdo.



bom dia Arthur Heinrich , Obrigado por responder ...
Essa mesmo esta sendo minha dificuldade ....

mesmo que eu renomeie este arquivo de .prn para .txt , ainda assim não consigo manipular ele.

Alguma sugestão de como fazer isso, contornar esse problema ?

se puder ajudar-me antecipo cordial agradecimentos....
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

28/10/2022

O arquivo PRN não é um arquivo texto. Ele contém caracteres de controle e, por isso, você não conseguirá utilizar o TStringList.

O outro exemplo utilizando TextFile não vai funcionar pelo mesmo motivo.

O arquivo é do tipo binário e pode não ser tão simples modificar o seu conteúdo.



bom dia Arthur Heinrich , Obrigado por responder ...
Essa mesmo esta sendo minha dificuldade ....

mesmo que eu renomeie este arquivo de .prn para .txt , ainda assim não consigo manipular ele.

Alguma sugestão de como fazer isso, contornar esse problema ?

se puder ajudar-me antecipo cordial agradecimentos....


Para ler arquivos binários, com tamanhos variados, você precisa utilizar a variável do tipo File (ao invés de TextFile).

Ao abrir o arquivo, especifique o tamanho de registro como sendo 1, para poder manipular os dados em formato binário.

AssignFile(Arq1, Arquivo);
Reset(Arq1, 1);

Para ler os dados, aloque um buffer de memória e utilize a função BlockRead() para ler os dados do arquivo no buffer. Use BlockWrite para escrever.

A sugestão aqui é alocar o buffer com um tamanho maior que o arquivo, para comportar a movimentação de dados, ao fazer o "replace".

Como o arquivo binário pode conter caracteres de código zero (#0), que indica o fim de strings do tipo PChar, não é possível utilizar a função de replace tradicional. Você terá que varrer o buffer em busca das strings a serem substituídas e, quando encontrá-las, terá que mover o conteúdo após estas strings, para ajustar o espaço para a nova string. Para isso, poderá utilizar a função Move().

Porém, mesmo que você substitua com sucesso os textos, sempre existe uma chance de não funcionar. Existem arquivos que são gravados em "pacotes", onde o header do pacote contém o tamanho. Ao alterar o conteúdo deste pacote, este header necessitaria ser ajustado. Podem existir inúmeras referências internas que podem ser quebradas com esta alteração e, dependendo da impressora, ela pode interpretar incorretamente o conteúdo do arquivo alterado.
GOSTEI 1
Mauricio Gabriel

Mauricio Gabriel

28/10/2022

O arquivo PRN não é um arquivo texto. Ele contém caracteres de controle e, por isso, você não conseguirá utilizar o TStringList.

O outro exemplo utilizando TextFile não vai funcionar pelo mesmo motivo.

O arquivo é do tipo binário e pode não ser tão simples modificar o seu conteúdo.



bom dia Arthur Heinrich , Obrigado por responder ...
Essa mesmo esta sendo minha dificuldade ....

mesmo que eu renomeie este arquivo de .prn para .txt , ainda assim não consigo manipular ele.

Alguma sugestão de como fazer isso, contornar esse problema ?

se puder ajudar-me antecipo cordial agradecimentos....


Para ler arquivos binários, com tamanhos variados, você precisa utilizar a variável do tipo File (ao invés de TextFile).

Ao abrir o arquivo, especifique o tamanho de registro como sendo 1, para poder manipular os dados em formato binário.

AssignFile(Arq1, Arquivo);
Reset(Arq1, 1);

Para ler os dados, aloque um buffer de memória e utilize a função BlockRead() para ler os dados do arquivo no buffer. Use BlockWrite para escrever.

A sugestão aqui é alocar o buffer com um tamanho maior que o arquivo, para comportar a movimentação de dados, ao fazer o "replace".

Como o arquivo binário pode conter caracteres de código zero (#0), que indica o fim de strings do tipo PChar, não é possível utilizar a função de replace tradicional. Você terá que varrer o buffer em busca das strings a serem substituídas e, quando encontrá-las, terá que mover o conteúdo após estas strings, para ajustar o espaço para a nova string. Para isso, poderá utilizar a função Move().

Porém, mesmo que você substitua com sucesso os textos, sempre existe uma chance de não funcionar. Existem arquivos que são gravados em "pacotes", onde o header do pacote contém o tamanho. Ao alterar o conteúdo deste pacote, este header necessitaria ser ajustado. Podem existir inúmeras referências internas que podem ser quebradas com esta alteração e, dependendo da impressora, ela pode interpretar incorretamente o conteúdo do arquivo alterado.




Boa noite Arthur Heinrich !!!!

Fantastica Explicação ... vou tentar estudar sobre a sugestão , pois nunca antes tinha me deparado com essa situação, mas o google e o forum devmedia são grandes professores ... como você já me deu o caminhos das pedrar , agora cabe eu colocar em pratica o aprendizado ....

Muito obrigado com compartilhar conhecimento.

Abraços.
GOSTEI 0
POSTAR