Substituir várias palavras de um arquivo .txt
28/10/2022
0
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
Post mais votado
01/11/2022
https://www.devmedia.com.br/impressora-zebra-tlp-2844-como-integrar-seu-sistema-com-a-impressora/9510
Raimundo Pereira
Mais Posts
03/11/2022
Mauricio Gabriel
https://www.devmedia.com.br/impressora-zebra-tlp-2844-como-integrar-seu-sistema-com-a-impressora/9510
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á.
02/12/2022
Mauricio Gabriel
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;
23/12/2022
Arthur Heinrich
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.
25/12/2022
Mauricio Gabriel
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....
26/12/2022
Arthur Heinrich
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.
26/12/2022
Mauricio Gabriel
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.
Clique aqui para fazer login e interagir na Comunidade :)