Fórum Importar arquivo txt com Delimitador | com campos vazios #572764
15/12/2016
0
Hoje estava fazendo uma integração com o meu sistema e preciso ler alguns arquivos de texto dentro de uma pasta e importar para meu sistema, as linhas são delimitadas separando assim seus campos, segue abaixo exemplo;
18|4|08.370.499/0001-30||||||3501608|1|A S MANTOVANI SUPERMERCADO - ME|SUPERMERCADO PEROLA|J||| ||||||R URUGUAI|JARDIM GIRASSOL|
Porem quando eu vou ler um campo que está vazio " Em branco " ele pula para o próximo campo, exemplo indice[0] = 18, indice[1] = 4, indice[2] = 08.370.499/0001-30, indice[3] ele já pula os campos |||||| e vai direto para o 3501608, e a importação acaba não dando certo.
Se alguém puder me ajudar eu agradeço!
Segue abaixo código que estou usando;
procedure Tfrmcarga.ImportarDados;
var
e:TextFile;
linha, dir:String;
Arquivos :TStringList;
j:Integer;
begin
Arquivos:= TStringList.Create;
dir := Caminhoimportacao;
FileListBox1.Directory := dir;
FileListBox1.Mask := '*.txt';
for J := 0 to FileListBox1.Count - 1 do
Begin
AssignFile(e, dir+'\\'+FileListBox1.Items.Strings[J]);
Reset(e); //abre o arquivo para leitura;
While not eof(e) do begin
Arquivos.Clear;
Readln(e,linha);
ExtractStrings(['|'], [], PChar(Linha),Arquivos);
if Arquivos[0] = '18' then
begin
with QinsCapa do
begin
Close;
SQL.Clear;
SQL.Add('insert into pedidos(COD_EMP, DATA, COD_VENDEDOR, COD_FORNECEDOR, ' +
'VENDA, DESCONTO, TOTAL, FORMAPG, COD_PEDIDO, CANCELADO, MOTIVO, ROMANEIO, ' +
'CNPJ, OBS, OBS2, COD_CLI, FRETE_CONTA, END_ENTREGA, COD_TPV, COD_TRA, ' +
'VALOR_FRETE, VR_FRETE_NA_FATURA, DATA_ENTREGA)values' +
'(:COD_EMP, :DATA, :COD_VENDEDOR, null, null, :DESCONTO, :TOTAL, :FORMAPG, ' +
':COD_PEDIDO, null, null, null, :CNPJ, :OBS, null, :COD_CLI, :FRETE_CONTA, ' +
':END_ENTREGA, :COD_TPV, null, null, null, null)');
ParamByName('COD_EMP').AsInteger := 1;
ParamByName('DATA').AsDate := StrToDate(FormatDateTime('dd/mm/yyyy',StrToDate(Arquivos[14])));
ParamByName('COD_VENDEDOR').AsInteger := StrToInt(Arquivos[10]);
ParamByName('DESCONTO').AsFloat := StrToFloat(Arquivos[40]);
ParamByName('TOTAL').AsFloat := StrToFloat(Arquivos[32]);
Qaux.Close;
Qaux.SQL.Clear;
Qaux.SQL.Add('select f.descricao from formas_pagamento f where f.codigo =:codigo');
Qaux.ParamByName('codigo').AsInteger := StrToInt(Arquivos[3]);
Qaux.Open;
ParamByName('FORMAPG').AsString := Qaux.FieldByName('descricao').AsString;
ParamByName('COD_PEDIDO').AsInteger := StrToInt(Arquivos[2]);
ParamByName('CNPJ').AsString := Arquivos[8];
ParamByName('OBS').AsString := Arquivos[37];
Qaux.Close;
Qaux.SQL.Clear;
Qaux.SQL.Add('select cod_cli from cliente where cnpj_cli =:cnpj');
Qaux.ParamByName('cnpj').AsString := Arquivos[8];
Qaux.Open;
ParamByName('COD_CLI').AsInteger := Qaux.FieldByName('cod_cli').AsInteger;
ParamByName('FRETE_CONTA').AsInteger := 0;
ParamByName('END_ENTREGA').AsString := 'P';
ParamByName('COD_TPV').AsInteger := StrToInt(Arquivos[4]);
ExecSQL;
IBTR.CommitRetaining;
end;
end;
End;
End;
ShowMessage('Ok');
Closefile(e);
End;
Softsan Software
Curtir tópico
+ 0Posts
19/12/2016
Marco Antônio
Não usei ''ExtractStrings'' e sim defini um delimitador, utilizando o seu exemplo deu certo.
Segue como fiz:
....
Readln(e,linha);
Arquivos.Clear;
Arquivos.LineBreak := ''|'';
....
Ao acessar cada indice verá que não vai pular nenhum campo e mostrará apenas valores vazios qdo não houver nada.
Para os campos que poderão vir vazios e no teu banco está definido como inteiro sugiro a usar da seguinte forma:
ParamByName(''COD_TPV'').AsInteger := StrToIntDef( Arquivos[4] , 0 ); // colocando valor defaul ''0'' qdo ñ puder converter em ''Inteiro''.
Abcs.
Gostei + 0
19/12/2016
Marco Antônio
....
Readln(e,linha);
Arquivos.Clear;
Arquivos.LineBreak := ''|'';
Arquivos.Text := linha; // faltou mencionar essa parte.
....
abcs
Gostei + 0
20/12/2016
Roberto Wutke
Então, existe uma propriedade do Delphi que é o SplitString, basicamente o que ele faz... ele pega a sua string e joga para uma variável que será do tipo arrayString... ai vc pode usar os índices dela para acessar os valores. Ai quando for vazio, aquele indice recebe vazio, ou seja, vc não vai mais ter esses problemas.
http://www.clipatecinformatica.com.br/2014/09/usando-funcao-splitstring-do-delphi.html
esse link tem um tutorial muito bacana de como utilizar e o que deve ser declarado para funcionar....
Espero ter ajudado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)