Exportação/Importação arquivos no formato TXT - Me ajudem
18/02/2013
0
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. #&?
Ismael Vale
Posts
18/02/2013
Lorival Filho
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' )
18/02/2013
Perivaldo Martins
Obs: Teste usando XE2
Boa sorte e bons códigos!
25/02/2013
Ismael Vale
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.
25/02/2013
Ismael Vale
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.
25/02/2013
Perivaldo 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!
25/02/2013
Perivaldo Martins
ANSI
Unicode
UTF-8
...
Boa sorte e bons códigos!
26/02/2013
Ismael Vale
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();
Clique aqui para fazer login e interagir na Comunidade :)