Ú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 NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA