Importar arquivo txt com Delimitador | com campos vazios
Boa tarde pessoal,
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;
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
Curtidas 0
Respostas
Marco Antônio
15/12/2016
Bom dia.
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.
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
Marco Antônio
15/12/2016
Opa:
....
Readln(e,linha);
Arquivos.Clear;
Arquivos.LineBreak := ''|'';
Arquivos.Text := linha; // faltou mencionar essa parte.
....
abcs
....
Readln(e,linha);
Arquivos.Clear;
Arquivos.LineBreak := ''|'';
Arquivos.Text := linha; // faltou mencionar essa parte.
....
abcs
GOSTEI 0
Roberto Wutke
15/12/2016
Falaaaa jovem, td bom???
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.
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