Estimados colegas les dejo aquí una forma de como importar un CSV.
En este ejemplo se utiliza el componente TFDBATCHMOVE, incorporado creo que en la versión XE7.
Y se supone que con apenas 5 lineas de codigo pueda importar un CSV, asignando el reader y writer correspondiente.
En versiones anteriores que incluyan Firedac, se puede hacer con el componente TFDDataMove (discontinuado en XE7 e incluido hasta XE8 por compatibildad).
procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin opendialog1.InitialDir := GetCurrentDir; if opendialog1.Execute then begin fdmemtable1.free; // destruimos componentes para eliminar datos default y cargados anteriormente FDBatchMove1.Free; // idem anterior fdmemtable1 := TFDMemTable.create(Form1); // creamos FDBatchMove1:= TFDBatchMove.Create(Form1); dataSource1.DataSet := fdmemtable1; // vinculamos la tabla al datasource //Create text reader and set FDBatchMode as owner. Then // FDBatchMove will automatically manage the reader instance. with TFDBatchMoveTextReader.Create(FDBatchMove1) do begin // Set text data file name FileName := opendialog1.FileName; // Setup file format DataDef.Separator := edsepara.Text[1]; // ** indicamos separador de campos en este caso ';' DataDef.Delimiter := #0; //** opcional, para campos sin QUOTED VALUES "valor" que es la opción default del componente Datadef.RecordFormat := rfCustom; //** for i := 0 to Datadef.Fields.Count-1 // ** para evitar problemas con campos FLOAT paso todos los campos a String. do Datadef.Fields[i].DataType := atString; // ** De no hacerlo he tenido errores [FireDAC][Comp][DM]-607. Bad text value [17,5] format for mapping item [->B]. '10,24' is not a valid integer value. for i := 0 to Datadef.Fields.Count-1 // debemos antes agregar los campos el FDMentable sino obtenemos un error de que no puede crear el dataset. do fdmemtable1.FieldDefs.Add(Datadef.Fields[i].FieldName,ftString, 20, False); DataDef.WithFieldNames := True; // setear si tiene los nombres de campo en primera linea end; // Create dataset writer and set FDBatchMode as owner. Then // FDBatchMove will automatically manage the writer instance. with TFDBatchMoveDataSetWriter.Create(FDBatchMove1) do begin // Set destination dataset DataSet := FDMemtable1; // Do not set Optimise to True, if dataset is attached to UI Optimise := False; end; // Analyze source text file structure FDBatchMove1.GuessFormat; FDBatchMove1.Analyze := ([ taDelimSep,taHeader,taFields]); // este comando crea la estructura de datos según adivina leyendo los primeros registros FDBatchMove1.AnalyzeSample := 50; // El default es 10, con esto profundizamos el analisis para adivinar estructura de tabla y campos FDBatchMove1.Execute; // y Eureka! Tenemos los datos en la tabla y visibles en el Dbgrid end; end;
Espero les sirva de ayuda o guia para algun proyecto