Exportação/Importação arquivos no formato TXT - Me ajudem

18/02/2013

1

Estou usando a seguinte procedure para gerar arquivos TXT com os registros da minha tabela:

procedure expCampos(cds: TCustomClientDataSet; tipoRegistro: String;var ArquivoCSV:TextFile;Linha:String);
var
i,nfield: smallint;
temp: String;
begin
// ->detalhe do registro (nome dos campos da tabela)
for i := 0 to Pred(cds.FieldCount) do
if cds.Fields[i].Tag = 0 then
begin
inc(nfield);
temp:= temp+ cds.Fields[i].DisplayLabel + ',';
end;
Delete(Temp, length(Temp), 1);
Writeln(ArquivoCSV, formatfloat('00',nfield)+'|'+temp);

// ->correr registro por registro da tabela
while not cds.Eof do
begin
Linha := tipoRegistro+'|'; // registro detalhe do reg I10
FormMenu.progBar.StepIt;
for i := 0 to Pred(cds.FieldCount) do
begin
if cds.Fields[i].Tag = 0 then
begin
if cds.Fields[i].DataType = ftString then
Linha := Linha + QuotedStr(TrimRight(cds.Fields[i].AsString)) + '|'
else if cds.Fields[i].DataType = ftFMTBcd then
Linha := Linha + formatcurr('000000', trunc(cds.Fields[i].AsCurrency))
+ '.' + formatfloat('00',
round(frac(cds.Fields[i].AsCurrency) * 100)) + '|'
else if cds.Fields[i].DataType = ftDate then
Linha := Linha + QuotedStr(FormatDateTime('dd.mm.yyyy',cds.Fields[i].AsDateTime)) + #124
else
Linha := Linha + cds.Fields[i].AsString + '|';
end;
end;

Delete(Linha, length(Linha), 1);
Writeln(ArquivoCSV, Linha);

cds.Next;
end;
cds.First;
end;

<b>O resultado é um arquivo TXT com as seguintes linhas:</b>

I1002|FAIXA_INSS,ALIQUOTA
I10|001174.86|000008.00
I10|001958.10|000009.00
I10|003916.20|000011.00
I2003|FAIXA_IRRF,ALIQUOTA,DEDUCAO
I20|002563.91|000007.50|000128.31
I20|003418.59|000015.00|000320.60
I20|004271.59|000022.50|000577.00
I20|999999999.00|000027.05|000790.58

<b>O problema é que uso Delphi XE2, e na hora de ler esse arquivo, e faço uma concatenação de uma linha lida do arquivo, e um outro texto, aparece uns caracteres estranhos no meio do texto.</b>
Por Exemplo:

leio assim: Readln(ArquivoCSV, Linha) //o valor da linha é: I1002|FAIXA_INSS,ALIQUOTA

concateno assim:
linha + ',COMPETENCIA'

o Resultado que sai é: I1002|FAIXA_INSS,ALIQUOTA,<b>#&?,/b>,COMPETENCIA

Então esses caracteres estranhos não deviam está ai. #&?
Responder

Posts

18/02/2013

Lorival Filho

Ismael, boa tarde!

Para exportar para TXT eu gosto de fazer de uma forma bem diferente.

Adicione o componente TMemo e trabalhe com ele para gerar o arquivo.

exemplo:

Memo1.Lines.Clear;

na linha que você adiciona os registros:

Memo1.Lines.Add ( valor da linha );

após adicionar todos os registros.

Memo1.Lines.SaveToFile ( 'arquivotexto.txt' )
Responder
Vc está lendo esse arquivo texto e exibindo ou armazenando essas dados aonde? Fiz usando esse resultado de seu arquivo texto eu fiz um aqui para ser lido, e não veio com nenhum caractere estranho, aguardo retorno.

Obs: Teste usando XE2

Boa sorte e bons códigos!
Responder

25/02/2013

Ismael Vale

Olá Martins.

Estou lendo o arquivo para gravar esses dados no banco de dados usando INSERT INTO TABELA.
Ele retorna um erro de INVALID TONKEI mostrando os caracteres estranhos.
Acredito que tenha haver com o unicode do delphi xe2. Não.

No bloco de notas ta igual postei acima. Coloquei um showmessage() pra mostrar o conteudo da TSQLDataSet e os caracteres aparecem. Uso DbXpress + SQLDataSet + ClientDataSet.
Responder

25/02/2013

Ismael Vale

Ismael, boa tarde!

Para exportar para TXT eu gosto de fazer de uma forma bem diferente.

Adicione o componente TMemo e trabalhe com ele para gerar o arquivo.

exemplo:

Memo1.Lines.Clear;

na linha que você adiciona os registros:

Memo1.Lines.Add ( valor da linha );

após adicionar todos os registros.

Memo1.Lines.SaveToFile ( 'arquivotexto.txt' )


Então o que estou fazendo é uma especie de backup/exportação de dados que poderão ser lidos nessa mesma aplicação ou outras aplicações que desenvolvi.
Responder
Olá Martins.

Estou lendo o arquivo para gravar esses dados no banco de dados usando INSERT INTO TABELA.
Ele retorna um erro de INVALID TONKEI mostrando os caracteres estranhos.
Acredito que tenha haver com o unicode do delphi xe2. Não.

No bloco de notas ta igual postei acima. Coloquei um showmessage() pra mostrar o conteudo da TSQLDataSet e os caracteres aparecem. Uso DbXpress + SQLDataSet + ClientDataSet.


Vc já depurou o código para ver em qual momento a mensagem está aparecendo?

Boa sorte e bons códigos!
Responder
Como está ficando a codificação do seu arquivo texto?

ANSI
Unicode
UTF-8
...

Boa sorte e bons códigos!
Responder

26/02/2013

Ismael Vale

Como está ficando a codificação do seu arquivo texto?

ANSI
Unicode
UTF-8
...

Boa sorte e bons códigos!


então eu uso a rotina acima da seguinte forma:

dbo.cdsIssqn.DisableControls;
Write(ArquivoCSV, 'I50');
// ->detalhe do reg
expCampos(dbo.cdsIssqn, 'I50',ArquivoCSV,Linha);
Application.MessageBox('Arquivo gerado com sucesso!',
'EXPORTAÇÃO DE DE ARQUIVO', MB_ICONINFORMATION + MB_OK);
Flush(ArquivoCSV);
CloseFile(ArquivoCSV);

Sendo assim não sei dizer qual a codificação que estou usando na função expCampos();
Responder