segunda-feira, 18 de julho de 2011

Importando arquivo CSV (Texto Delimitado)

A procedure abaixo listada permite ler qualquer arquivo de texto delimitado, quer seja por virgula, ponto e vírgula ou qualquer outro delimitador. Para tanto basta informar corretamente o delimitador na função aninhada MontaValor.
No exemplo abaixo as informações contidas no arquivo texto serão gravadas em dois ClientDataSet.

procedure TForm1.ImportarCSV;
var ArquivoCSV : TextFile;
    Contador, I : Integer;
    Linha : String;


  // Lê Linha e Monta os valores
  function MontaValor : String;
  var ValorMontado : String;
  begin
     ValorMontado := '';
     inc(I);
     While Linha[I] >= ' ' do
     begin
        If Linha[I]= ';' then  // vc pode usar qualquer delimitador ... eu estou usando o ";"
        break;
        ValorMontado := ValorMontado + Linha[I];
        inc(I);
     end;
     result := ValorMontado;
  end;


begin
   // Carregando o arquivo ...
   AssignFile(ArquivoCSV, 'c:\Nome_do_Arquivo');


   try
      Reset(ArquivoCSV);
      Readln(ArquivoCSV, Linha);
      Contador := 1;


      while not Eoln(ArquivoCSV) do
      begin
         if Contador = 1 then  // Primeira Linha do arquivo (Pedido);
         begin
            I := 0;
            cdsPedido.Append;
            cdsPedidoCodigoCliente.AsString  := MontaValor;
            cdsPedidoNomeDoCliente.AsString := MontaValor;
            cdsPedido.Post;
         end
         else
         begin
            // Demais Linhas (Itens do Pedido )
            I := 0;


            cdsItensDoPedido.Append;
            cdsItensDoPedidoCodigoProduto.AsString := MontaValor;
            cdsItensDoPedidoNomeDoProduto.AsString := AnsiUpperCase(MontaValor);
            cdsItensDoPedidoQuantidade.AsFloat     := StrToFloat(MontaValor);
            cdsItensDoPedidoPreco.AsCurrency       := StrToCurr(MontaValor);
            cdsItensDoPedido.Post;
         end;


         Readln(ArquivoCSV, Linha);
         Contador := Contador + 1;
      end;


   finally
      CloseFile(ArquivoCSV);
   end;


end;


Um grande abraço e até o próximo post.