JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo conectarse a un archivo de texto CSV con ADO/OLEDB

Últimamente me encontré con este problema en una integración y, aunque parece un tontería, lo cierto es que tiene más miga de la que parece... Tras haber investigado un poco y a base de prueba y error llegué a las siguientes conclusiones que considero bastante interesantes.

Para conectarse a un archivo de texto CSV desde ADO/OLEDB como si se tratase de una base de datos se debe utilizar una cadena de conexión especial.

Si se trata de un archivo CSV con encabezados, es decir, que lleva en su primera fila los nombres de los campos la cadena de conexión a utilizar es la siguiente:

"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=Ruta_a_la_carpeta_contenedora_del archivo;Extensions=asc,csv,tab,txt;HDR=NO;Persist Security Info=False"

Si, por el contrario, el archivo de texto no tiene cabeceras con nombres de columnas la cadena de conexión adecuada es la siguiente:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Ruta_a_la_carpeta_contenedora_del archivo;Extended Properties='text;HDR=NO;FMT=Delimited'"

Una vez conectados a la carpeta contenedora, cada archivo en su interior se considera una tabla/relación de datos. Por ello para acceder a sus contenidos basta con escribir consultas como esta:

"SELECT * FROM Nombre_Archivo.txt"

Por supuesto se pueden usar funciones de agregación como COUNT(*) o SUM, MAX, etc... para obtener datos, e instrucciones como ORDER BY para ordernarlos.

En caso de querer obtener subconjuntos de los registros se pueden usar condiciones dentro de una claúsula WHERE, al igual que en cualquier otro origen de datos. Si el archivo contiene los nombres de campos se usan éstos para las condiciones. En caso de no disponer de nombres de campos se accede a ellos mediante el uso de su ordinal precedido por la letra 'F'. Por ejemplo, para poner una condición con el segundo campo del archivo se usaría F2 < 2000.
También se pueden usar alias para los nombres de los campos, de forma que el Recordset resultante asigne ese nombre a cada columna en la colección Fields. Ejemplo de todo esto combinado:

"SELECT F1 AS EMail, F2 AS Nombre FROM Clientes.txt WHERE F1 LIKE '%@%.es' ORDER BY F1"

Espero que a alguien le ahorre el tiempo que perdí yo para llegar a esta conclusión ;-)

¿Este post te ha ayudado?, ¿has aprendido algo nuevo? Pues ¡ayúdame a ayudar a otros! No te costará nada y puedes conseguir premio. Es muy importante. Pulsa para saber más...
José Manuel Alarcón
Banner

Comentarios (3) -

Pues en principio no debería pasarte eso. Con la sintaxis que usas tú debería funcionar sin problemas.

Igual hay un "bug" en la versión de JET que estás usando.

Siento no poder ayudarte.

JM.

Responder

Hola:

para hacer consultas con fechas con OLEDB sobre archivos de texto debes usar formato americano para las fechas (es decir, mm/dd/yyyy y además el delimitador de las mismas no es la comilla simple como tú usas, sino que son las almohadillas, así:

#1/10/2008#

sería el 10 de enero de 2008.

Espero que esto te sirva.

Saludos

JM.

Responder

Hola Marina:

échale un vistazo a esto:

http://support.microsoft.com/kb/149090/en-us

y a esto:

msdn2.microsoft.com/en-us/library/ms709353.aspx

No te acostumbres mal, no puedo contestar siempre ;-)

Saludos

JM.

Responder

Agregar comentario