Substituir várias palavras de um arquivo .txt
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 .
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.
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
Curtidas 0
Melhor post
Raimundo Pereira
01/11/2022
Veja se ajuda
https://www.devmedia.com.br/impressora-zebra-tlp-2844-como-integrar-seu-sistema-com-a-impressora/9510
https://www.devmedia.com.br/impressora-zebra-tlp-2844-como-integrar-seu-sistema-com-a-impressora/9510
GOSTEI 1
Mais Respostas
Mauricio Gabriel
28/10/2022
Veja se ajuda
https://www.devmedia.com.br/impressora-zebra-tlp-2844-como-integrar-seu-sistema-com-a-impressora/9510
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á.
GOSTEI 0
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;
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
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.
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
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.
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
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.
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
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.
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