Ir al contenido


Foto

Exportar ADO a CSV


  • Por favor identifícate para responder
10 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 febrero 2010 - 10:37

Pues eso, les traigo un procedimiento para exportar datos desde ADO a un archivo .CSV, aquí el code:



delphi
  1. procedure SaveDataSetCSV;
  2. const
  3.   adClipString = 2;
  4.   ColumnDelimiter = ';';
  5.   RowDelimiter = #13#10;
  6. var
  7.   s : String;
  8.   fs : TFileStream;
  9. begin
  10.   SaveDialog1.DefaultExt := '.CSV';
  11.   // creamos el nombre del archivo por defecto
  12.   SaveDialog1.FileName := ADOTable1.TableName+SaveDialog1.DefaultExt;
  13.  
  14.   if SaveDialog1.Execute then
  15.   begin
  16.       // Obtenemos el dataset completo como CSV
  17.       s := ADOTable1.Recordset.GetString(adClipString, ADOTable1.Recordset.RecordCount, ColumnDelimiter, RowDelimiter, '');
  18.  
  19.       // Guardamos la cadena CSV como Archivo
  20.       fs := TFileStream.Create(SaveDialog1.FileName, fmCreate);
  21.       try
  22.         fs.WriteBuffer(s[1], Length(s));
  23.       finally
  24.         fs.Free;
  25.       end;
  26.   end;
  27. end;



Que lo disfruten (y)).

Saludos.
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 22 febrero 2010 - 12:37

Hola.

Yo me he creado un procedimiento estándar para exportar cualquier Dataset a CSV (y no solo Datasets ADO).

La ventaja, aparte de funcionar para cualquier Dataset, es que como todo el código está incluido en el procedimiento, es más fácil de personalizar. Por ejplo., he puesto que ponga una primera fila, con los nombres de campos (cogiéndolos de la propiedad DisplayLabel para poder mostrar un nombre más descriptivo que el verdadero nombre del campo). Así como también lo he programado para que no exporte los campos con visible a False.



delphi
  1. procedure ExportarCSV(Dataset: TDataset; Archivo: String);
  2. var iArchivo: TStringlist;
  3.     Linea: String;
  4.     i: Integer;
  5. begin
  6.   iArchivo := TStringlist.Create;
  7.   Linea := '';
  8.   for i := 0 to Dataset.FieldCount - 1 do begin
  9.     if Dataset.Fields[i].Visible then begin
  10.       if Linea <> '' then Linea := Linea + ';';
  11.       Linea := Linea + AnsiQuotedStr(Dataset.Fields[i].DisplayLabel, '"');
  12.     end;
  13.   end;
  14.   iArchivo.Add(Linea);
  15.   Dataset.DisableControls;
  16.   Dataset.First;
  17.   while not Dataset.Eof do begin
  18.     Linea := '';
  19.     for i := 0 to Dataset.FieldCount - 1 do begin
  20.       if Dataset.Fields[i].Visible then begin
  21.         if Linea <> '' then Linea := Linea + ';';
  22.         Linea := Linea + AnsiQuotedStr(Dataset.Fields[i].AsString, '"');
  23.       end;
  24.     end;
  25.     iArchivo.Add(Linea);
  26.     Dataset.Next;
  27.   end;
  28.   Dataset.First;
  29.   Dataset.EnableControls;
  30.   iArchivo.SaveToFile(Archivo);
  31. end;




  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 febrero 2010 - 12:44

Excelente amigo Marc, mucho mejor pues (y) :D
  • 0

#4 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 22 febrero 2010 - 01:06

:cheesy:

Que tal muchachos, yo he usado los dos procedimientos y solo como detalle me queda mencionar que en mi caso, cuando quieres guardar una cantidad grande de registros, el primer metodo es mucho mas rapido que el segundo, el problema con el que yo me enfrenté fue el formato con el que guardan los datos del tipo fecha en el archivo csv, ya que ignoro la manera de como personalizarlos.

Saludos

Kafastoforman
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 febrero 2010 - 01:10

Pues por aquí puse algo parecido:

http://www.delphiacc...g11339#msg11339

Otra alternativa mas
  • 0

#6 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 22 febrero 2010 - 02:29

Hola.

Que tal muchachos, yo he usado los dos procedimientos y solo como detalle me queda mencionar que en mi caso, cuando quieres guardar una cantidad grande de registros, el primer metodo es mucho mas rapido que el segundo, el problema con el que yo me enfrenté fue el formato con el que guardan los datos del tipo fecha en el archivo csv, ya que ignoro la manera de como personalizarlos.
orman


Es bastante lógico que el primer método sea más rápido que haciendo personalmente el recorrido, aunque realmente has de tener una cantidad muy grande de registros para que valga la pena.

¿ Has probado a establecer el formato de los campos fecha-hora en su propiedad DisplayFormat ?, seria lo lógico.

Saludos.
  • 0

#7 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 22 febrero 2010 - 03:17

Que tal marc, lo intente con 400,000 registro y la diferencia de tiempos entre un metodo y otro, fue considerable.


¿ Has probado a establecer el formato de los campos fecha-hora en su propiedad DisplayFormat ?, seria lo lógico.

Saludos.


¿A que objeto pertenece a propiedad DisplayFormat? por que lo que habia intentado es cambiar los formatos de ShortTimeFormat y ShortDateFormat, pero no tenia ningun efecto.

Saludos

Kafastoforman
  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 22 febrero 2010 - 03:24

Que tal marc, lo intente con 400,000 registro y la diferencia de tiempos entre un metodo y otro, fue considerable.


Sí, a eso me refería cuando decía que la diferencia solo vale la pena para una cantidad muy grande de registros. Esta claro que con unos pocos miles de registros apenas se va a notar la diferencia, pero si hablamos de centenares de miles de registros, entonces ahí toda optimización siempre es poca.

¿A que objeto pertenece a propiedad DisplayFormat? por que lo que habia intentado es cambiar los formatos de ShortTimeFormat y ShortDateFormat, pero no tenia ningun efecto.


Esta propiedad se encuentra en el campo persistente (TField) dentro del Dataset (con un doble click sobre el Dataset abres su colección de campos persistentes), correspondiente al campo fecha-hora que quieras personalizar.

Saludos.
  • 0

#9 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 22 febrero 2010 - 03:44


Esta propiedad se encuentra en el campo persistente (TField) dentro del Dataset (con un doble click sobre el Dataset abres su colección de campos persistentes), correspondiente al campo fecha-hora que quieras personalizar.

Saludos.

:cheesy:
Muchas gracias Marc, no conocia esa propiedad y lo probare a ver que tal. lo encontre como una propiedad de TDateTimeField la cual deciende de TField


delphi
  1.   (ADOStoredProc1.Fields[1] as TDateTimeField).DisplayFormat


Saludos
  • 0

#10 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 22 febrero 2010 - 04:09



Esta propiedad se encuentra en el campo persistente (TField) dentro del Dataset (con un doble click sobre el Dataset abres su colección de campos persistentes), correspondiente al campo fecha-hora que quieras personalizar.

Saludos.

:cheesy:
Muchas gracias Marc, no conocia esa propiedad y lo probare a ver que tal. lo encontre como una propiedad de TDateTimeField la cual deciende de TField


delphi
  1.   (ADOStoredProc1.Fields[1] as TDateTimeField).DisplayFormat


Saludos


Ya lo probe y no resulto :sad: cambia el formato de la fecha en el dbgrid, pero no lo cambia en el archivo csv generado.

Saludos

Kafastoforman
  • 0

#11 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 22 febrero 2010 - 07:25

Saludos

Si quisieras tratar la fecha de una manera distinta utiliza la función DecodeDate.

Returns Year, Month, and Day values for a TDateTime value.


delphi
  1. procedure DecodeDate(const DateTime: TDateTime; var Year: Word; var Month: Word; var Day: Word);



  • 0




IP.Board spam blocked by CleanTalk.