Leer archivos CSV, Obdc vs Oledb

Después de un par de horas angustia, tengo algunas conclusiones que le pueden servir aquellos que estén manipulando archivos CSV.

El tema es que tengo un formulario, donde se suben productos de diversos proveedores (a través de archivos excels, csv, txt, y xml), a la base de datos. Y estaba habilitando el soporte para archivos CSV (puedes abrir el archivo con el Notepad y darte cuenta porque es “Comma-separated values”, aunque tenga el icono asociado de excel).

Y aunque lo puedes leer con System.IO, pues tienes la opción de leer con un determinado proveedor como OleDb o Obdc. Usar un dataReader, recorrerlo, llenarlo a una List<Product>, y poder usar Linq to Objects, para filtros extras antes de enviarlo a tu base de datos.

Por suerte que si llegaba primero al otro, ya no aprendía nada, y no hubiera tenido existencia este post primero llegue a este artículo donde se lee el CSV con Obdc: Importing CSV Data and saving it in database. Y para archivos grandes con columnas simples, no he tenido ningún problema.

Pero llego un file de un proveedor, que tenia unos cuantos registros con unas columnas (descripción), anómalas… y que estaba lanzado una excepción… lo peor que el mensaje de la excepción estaba en blanco, como buscar ayuda sin mensaje de error ¿? :S… después de cierto tiempo de guerra con el archivo, vi que por lo menos la excepción te daba el Stack Trace, y por fin vi una luz: OdbcException: NO_DATA – no error information. Este thread comentaba que habría que tener la ultima versión de MDAC, descargue la herramienta, MDAC Utility: Component Checker, para verificar que versión de MDAC tengo, y por lo que entendí :S, parece que tengo la última versión.

A volver a recorrer la lista y depurar, después de minutos de penurias me pude dar cuenta que un registro no tomaba las ultimas 6 columnas, para ese registro no existían, pero los demás registros si reconocía estas columnas, pero el registro en cuestión lanzaba una excepción cuando intentaba acceder al índice, y decía que no existía. Este registro tenía una columna anómala a las de más (el archivo esta bien porque con excel, ves toda la información del archivo).

Lo único que se me ocurrió, antes de tirar la toalla era que la conexión podía tener otros parámetros para burlar este bug, y fui a ConnectionStrings. Ahí pude notar que también podía leer los CSV, con OleDb. De ahí vi la luz, y comenzaron a salir los artículos: Manipulating CSV files.

Y nada que con OleDb, ya no tenía ningún problema. Me queda como conclusión que OleDb, es más salvaje para leer los archivos, y tiene más soporte para columnas anómalas.

Después de unas horas de angustia, ya me siento deshagoado :D, no dicen que la mejor terapia es escribir un post? xD

P.D.: Encontré este otro artículo: A Fast CSV Reader, es una clase personalizada para leer archivos CVS… pero surge la pregunta, quieres rapidez o soporte (en la comunidad, foros, blogs, etc)?, en mi caso más que rapidez se necesita salvajismo para leer los archivos :D.

Saludos,

4 comentarios en “Leer archivos CSV, Obdc vs Oledb”

  1. Necesito ayuda urgente para leer utilizando c++ el contenido de un archivo csv, la primera línea no me sirve, el resto contiene valores numéricos tipo float, encuentro programas en c pero lo necesito en c++. Muchas gracias, unsaludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *