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;