2009-07-09 19 views
15

Duplicar posibles:
CSV File Imports in .Net¿Hay una manera "correcta" para leer archivos CSV

En .NET, ¿hay una biblioteca estándar que se debe utilizar para leer en archivos CSV ? Todas las muestras en la web ruedan su propio lector/analizador csv, o usan OleDb.

No es un problema utilizar cualquiera de estas soluciones, solo me preguntaba si hay una biblioteca generalmente aceptada (no es que pueda encontrarla), o alguna otra forma "adecuada" de hacerlo.

Respuesta

18

CsvReader es bastante bueno ... no es Microsoft, pero funciona muy bien, y es mucho más rápido que algunas de las alternativas (legado OleDb, etc.).

+0

Esta fue la la mejor biblioteca que pude encontrar. Tuve que corregir algunos errores relacionados con un soporte más oscuro para ciertas cosas, pero estaba bien en las cosas estándar. TI es algo ineficiente en cuanto a que hace una concatenación de cadenas repetida. Con un poco de rejigging lo cambié para usar StringBuilder en el bucle principal para la mayoría de los casos y eso te da un aumento de velocidad masivo – ShuggyCoUk

+0

Sí, lo estoy investigando en este momento, parece manejar muchos de los casos extremos. No parece haber nada parecido. – Gareth

+7

de hecho voy a ver si los chicos quiere mis cambios de código en lugar de tratar de mantener a mí mismo ... – ShuggyCoUk

0

Estoy bastante seguro de que puede leer un archivo CSV en una DataTable con una línea de código. Una vez que está en una DataTable, puede ordenar, filtrar, iterar, etc.

This question tiene algunos ejemplos para leer CSV en DataTables.

+0

He estado en este camino muchas veces. Cuando funciona, funciona bien, pero los problemas de depuración cuando no funciona son un dolor masivo. – aSkywalker

+0

¿Eh? Los únicos problemas con los que me he encontrado en los archivos CSV eran los datos en sí (comas adicionales, comillas que faltaban, etc.), y esos serían problemas independientemente del método de análisis que utilizara. – MusiGenesis

+1

sí, el problema casi siempre es con los datos, pero ¿en qué parte de los datos? Empezamos a cambiar a la clase TextFieldParser en cada lugar (cientos) debido a las limitaciones y la falta de control que brindaba. Trabajó el 90% del tiempo, pero cuando no lo hizo, no se proporcionó ayuda en el error. Creamos una biblioteca de clases para solucionar este problema: depurar primero los datos sin formato, etc. Si no ha probado la clase TextFieldParser, realmente debería, nos encanta, y analizar millones de filas de datos de csv cada mes. – aSkywalker

9

Una de las razones por las cuales muchas personas escriben la suya es que CSV no es tan simple. Por ejemplo:

  1. ¿La primera fila contiene nombres de campo, o no?
  2. ¿Es compatible con las fechas? Si, entonces, ¿están citados, rodeados de # marcas, en un cierto orden de día-mes-año?
  3. ¿Soporta linefeeds que ocurren dentro de los valores de texto entre comillas? ¿O eso divide el registro?
  4. ¿Cómo se puede escapar una cita dentro de una cadena entrecomillada? ¿Dobla la cita, o usa una barra invertida u otro carácter de escape?
  5. ¿Qué codificación (s) de caracteres son compatibles?
  6. ¿Cómo maneja los caracteres de control escapados? & #XX; o \ uXXXX o algún otro método?

Estos son algunos de las razones por la gente escribe sus propios programas de análisis, porque son archivos de lectura atascados creados con todas estas diferentes configuraciones. O escriben sus propios serializadores, porque el sistema de destino tiene un montón de estas idiosincrasias.

Si no le importan estos problemas, solo use la biblioteca más conveniente. Pero entiende que están ahí.

+11

Todos ellos suenan como buenas razones * no * para escribir su propia, si no quiere repetir los mismos errores que otros ya lo han hecho (y posiblemente arreglado). – LukeH

+1

El lector CSV debe entregar una lista de filas que contienen cadenas o un iterable correspondiente; cómo data/numbers/whatever están almacenados dentro de un campo CSV es la preocupación de una capa diferente en una aplicación no monolítica. Otros puntos son buenas razones para tener un paquete de lectura y escritura de CSV, NO para hacerlo usted mismo. Muchos esfuerzos de bricolaje reinventan la rueda como un polígono con menos de 6 lados y sin eje :-) –

+0

Estoy de acuerdo. Esta es la razón por la que estaba alentando a la gente * no * a que escribiera la suya propia, o si ellos * tienen * a, para pensar en los problemas. – lavinio

2

Después de un poco más de investigación, también hay esto: http://www.filehelpers.com/

Parece un marco completo alrededor de la lectura de archivos, y no sólo los archivos CSV.

(nota: acaba de leer cosas en el sitio web, no se han utilizado todavía)

10

El espacio de nombres VB tiene una gran clase TextFieldParser. Sé que a la gente de C# no le gusta hacer referencia a una biblioteca desde ese lenguaje 'básico', pero es bastante bueno.

Se encuentra en Microsoft.VisualBasic.FileIO.TextFieldParser

solía meterse con OLEDB, la creación de archivos de definición de columna, etc - pero encuentra la TextFieldParser una herramienta muy simple y práctico para el análisis de los archivos delimitados.

+3

Sí, también me gusta esta clase ...pero realmente me pregunto por qué MS lo colocó en un conjunto específico de VB, ¡no tiene ningún sentido! –

+8

@Thomas: los programadores de VB esperan funciones de análisis de cadenas fáciles de usar, mientras que los programadores de estilo C esperan sufrir terriblemente cuando se trata de cadenas. – MusiGenesis

+2

Acabo de descubrir esta clase, y era justo lo que estaba buscando. Está integrado, es fácil de usar y maneja los campos delimitados con comillas. Lo recomiendo para ocasiones en las que no necesita una solución compleja, especialmente cuando trabaja en un entorno que no está muy abierto para bibliotecas de terceros. –

1

KBCsv es otra opción, especialmente si usted requiere la eficiencia y la capacidad de trabajar con archivos CSV masivas.

Divulgación: Escribí KBCsv, de ahí el "KB";)

6

Trate CsvHelper (una biblioteca mantengo). También está disponible a través del NuGet.

CsvHelper le permite leer el archivo CSV directamente en la clase personalizada.

var streamReader = // Create a reader to your CSV file. 
var csvReader = new CsvReader(streamReader); 
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>(); 

CSVReader mostrará automáticamente cómo hacer coincidir los nombres de propiedad basados ​​en la fila de encabezado (esto es configurable). Utiliza árboles de expresión compilados en lugar de reflexión, por lo que es muy rápido.

También es muy extensible y configurable.

+1

¡Tenga algún ejemplo sobre esto ya que la documentación en el sitio del proyecto es barebones! Quiero leer todo el archivo y permitir que el usuario asigne los encabezados a una lista de atributos. Defino – Andrew

+0

. Esperemos que pronto se traslade al wiki en el repositorio de github. La forma en que se creó el sitio fue un gran dolor; usando castillos de arena Si tiene una pregunta específica, formule una nueva pregunta de SO. –

+0

Consulte esta pregunta: http://stackoverflow.com/questions/5496845/using-csvhelper-with-c-mvc-to-import-csv-files – Andrew

Cuestiones relacionadas