Usar archivos CSV en modo Tabla con Delphi y ADO

El formato CSV es de los más populares para compartir información entre sistemas, muy probablemente gracias a su estructura sencilla donde los valores se dividen en filas y columnas separados por caracteres.  Leer estos archivos, generarlos e importarlos en nuestros sistemas puede resultar una tarea tediosa y es precisamente por esa razón que me he decidido a escribir este artículo donde mostraré como podemos leer, escribir y buscar datos en archivos CSV de manera muy sencilla gracias a la combinación Delphi con ADO.

***Si aún tienes dudas sobre el estándar CSV te recomiendo visites en la wikipedia el artículo donde se brinda más información : http://es.wikipedia.org/wiki/CSV

Con ADO podemos tratar a los archivos CSV como si fueran tablas en una base de datos y por tanto realizar operaciones de lectura y escritura sobre estos. Para ello será necesario usar el proveedor OleDb del Motor JET, el cuál ha sido desarrollado por Microsoft y nos permite realizar conexiones a múltiples orígenes de datos, entre ellos claro CSV.

***Es sumamente recomendable darle una lectura a la entrada en la Wiki acerca de Jet: http://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine

Archivo CSV de ejemplo

Para este artículo usaremos como datos muestra la tabla de países que amablemente Google Labs nos proporciona en la siguiente dirección: https://developers.google.com/public-data/docs/canonical/countries_csv .En esta página encontraremos la siguiente tabla:

Countries csv

Pero antes de usar esta información será necesario copiar el contenido de la tabla y crear un archivo CSV usando como separador de columnas la letra “,”. El archivo que he generado para este artículo podrán encontrarlo en la descarga del código fuente. Este es un bloque de ejemplo de como debe quedar el archivo:

country,latitude,longitude,name
D,42.546245,1.601554,Andorra
AE,23.424076,53.847818,United Arab Emirates
AF,33.93911,67.709953,Afghanistan
AG,17.060816,-61.796428,Antigua and Barbuda
AI,18.220554,-63.068615,Anguilla
AL,41.153332,20.168331,Albania

Configurando la conexión a los archivos CSV.

Ejecutaremos Delphi y crearemos una nueva aplicación VCL Forms, colocamos un componente TADOConnection y en su propiedad ConnectionString colocaremos lo siguiente:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\RutaDirectorioCsv;Extended Properties=”text;HDR=Yes;FMT=Delimited(,)”;

Donde:

Provider: Nombre del proveedor OleDb a usar.

Datasource: Directorio donde vamos a colocar nuestros archivos CSV

Extended Properties: Indica que el origen será un archivo de texto donde HDR=Yes establece que la primera fila es el Header y FMT el caracter delimitador.

Después en nuestro componente TADoConnection establecemos a False la propiedad LoginPrompt y la propiedad Active a True. De esta manera tendremos la conexión activa y podremos comenzar a realizar operaciones sobre los archivos CSV.

Abrir un CSV como Tabla de base de datos.

Una vez establecida la conexión con ADO y Jet al directorio con nuestros archivos csv es posible darles el mismo trato que le damos a una tabla de una base de datos. Para probar esto ahora colocaremos en nuestro proyecto los siguientes componentes: 1 TDbGrid, TdbNavigator, TDataSource, TAdoTable y los vamos a configurar de la siguiente manera:

Componente Propiedad Valor
AdoTable1 Connection DbConCsv
AdoTable1 TableName countries#csv
 
DataSource1 Dataset AdoTable1
 
DbGrid1 DataSource Datasource1
 
DbNavigator1 DataSource Datasource1

Después seleccionaremos la propiedad TableName del componente TAdoTable y desplegaremos la lista de tablas y seleccionaremos countries. Seleccionada la tabla modificaremos la propiedad Active a True   y en ese momento el contenido del archivo CSV se mostrará en el DbGrid como se puede apreciar en la siguiente imagen.

 

Diseño TAdoTable CSV

 

Este programa de ejemplo que hemos hecho de manera sencilla y rápida con Delphi, es capaz en este punto de navegar por las filas del archivo CSV y agregar o editar datos.

 

Ejecutando sentencias SQL en archivos CSV

¿Si podemos tratar como tablas a los archivos CSV es posible ejecutar sentencias SQL en ellos? La respuesta es sí aunque de forma parcial. El propio motor Jet nos permite ejecutar sentencias de selección o inserción. Para probar esta funcionalidad cargaremos un Dataset que contenga solo aquellos países que se localizan entre las latitudes 40 y 45. Comenzaremos colocando un TDataSet un dbGrid y un DataSource y los configuraremos como en el ejemplo anterior. Después daremos click en la propiedad CommandText del componente TADODataset y escribiremos en la ventana la siguiente consulta:

select  country, latitude, longitude, name
   from countries#csv
where latitude > 40 and
           latitude < 45

Después vamos a modificar la propiedad Active a True obteniendo el resultado en el Dbgrid tal y como se muestra en la siguiente imagen:

 

CsvAdoDataset

 

Ahora como última prueba colocaremos un TAdoQuery y un Botón y editaremos el evento Onclick del botón para colocar lo siguiente:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ADOQuery1.Connection := DbConCsv;
  ADOQuery1.SQL.Text := 'INSERT INTO countries#csv VALUES("U","0","1","Prueba insert sql")';
  ADOQuery1.ExecSQL;
end;

Ejecutamos la aplicación y presionamos el botón. Después abrimos el archivo countries.csv y veremos lo siguiente al final del mismo:

CsvAdoAdoQuery

 Como se puede apreciar, Delphi y ADO nos permiten trabajar de manera sencilla con estos archivos CSV. Si deseas descargar el código fuente de esta entrada lo puedes encontrar aquí: [download id=”1″]

Espero que esta información sea de utilidad.

 

6 Comments

  1. El ejemplo está muy bueno, pero no funciona:

    El driver de texto ODBC sólo soporta la instrucción INSERT.
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;146220

    Una limitación importante que presenta el ADO e3 ISAM de Texto del motor
    Microsoft Jet, es que sólo nos permitirá añadir registros al archivo
    de texto, por lo que no podremos eliminar registros o actualizar los datos
    existentes en dicho archivo, ya que obtendremos el siguiente mensaje de
    error: Este ISAM no admite la actualización/eliminación de datos en una
    tabla vinculada. Por tanto, no podremos ejecutar los comandos DELETE o
    UPDATE de SQL

1 Trackback / Pingback

  1. » Exportar DataSet a Csv en una línea de código. (ADO)

Deja un comentario