Estoy escribiendo una aplicación de importación simple y necesito leer un archivo CSV, mostrar el resultado en DataGrid
y mostrar líneas corruptas del archivo CSV en otra cuadrícula. Por ejemplo, muestre las líneas que son más cortas que 5 valores en otra cuadrícula. Estoy tratando de hacer eso así:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
pero es muy difícil operar en matrices en este caso. ¿Hay una mejor manera de dividir los valores?
Respuestas:
No reinventes la rueda. Aproveche lo que ya está en .NET BCL.
Microsoft.VisualBasic
(sí, dice VisualBasic pero también funciona en C #, recuerde que al final todo es solo IL)Microsoft.VisualBasic.FileIO.TextFieldParser
clase para analizar el archivo CSVAquí está el código de ejemplo:
Funciona muy bien para mí en mis proyectos de C #.
Aquí hay algunos enlaces / información más:
fuente
TextFieldParser
e hizo el truco. Graciasparser.TextFieldType = FieldType.Delimited;
no es necesaria si llamaparser.SetDelimiters(",");
, ya que el método establece laTextFieldType
propiedad por usted."text with quote"", and comma"
, y puede obtener el valor correcto entext with quote", and comma
lugar de valores separados incorrectamente. Por lo tanto, es posible que desee optar por String.Split si su csv es muy simple.Mi experiencia es que hay muchos formatos diferentes de CSV. Especialmente cómo manejan el escape de comillas y delimitadores dentro de un campo.
Estas son las variantes con las que me he encontrado:
He probado muchos de los analizadores csv existentes, pero no hay ninguno que pueda manejar las variantes con las que me he encontrado. También es difícil averiguar en la documentación qué variantes de escape admiten los analizadores.
En mis proyectos ahora uso el VB TextFieldParser o un divisor personalizado.
fuente
Recomiendo CsvHelper de Nuget .
(Agregar una referencia a Microsoft.VisualBasic simplemente no se siente bien, no solo es feo, probablemente ni siquiera sea multiplataforma).
fuente
CsvHelper
viene con una fila incorporada en el asignador de clases; permite variaciones en los encabezados de las columnas (si están presentes), e incluso variaciones aparentemente en el orden de las columnas (aunque no he probado este último). En general, se siente mucho más "alto nivel" queTextFieldParser
.A veces, usar bibliotecas es genial cuando no desea reinventar la rueda, pero en este caso uno puede hacer el mismo trabajo con menos líneas de código y más fácil de leer en comparación con el uso de bibliotecas. Aquí hay un enfoque diferente que encuentro muy fácil de usar.
fuente
CSV puede complicarse muy rápido.
Use algo robusto y bien probado:
FileHelpers: www.filehelpers.net
fuente
Yo uso esto aquí:
http://www.codeproject.com/KB/database/GenericParser.aspx
La última vez que estaba buscando algo como esto lo encontré como respuesta a esta pregunta .
fuente
Otro a esta lista, Cinchoo ETL , una biblioteca de código abierto para leer y escribir archivos CSV
Para un archivo CSV de muestra a continuación
Rápidamente puede cargarlos usando la biblioteca como se muestra a continuación
Si tiene una clase POCO que coincide con el archivo CSV
Puede usarlo para cargar el archivo CSV como se muestra a continuación
Por favor revisa los artículos en CodeProject sobre cómo usarlo.
Descargo de responsabilidad: soy el autor de esta biblioteca
fuente
fuente
En primer lugar, debe comprender qué es CSV y cómo escribirlo.
/r/n
) es la siguiente fila de "tabla".\t
o,
/r/n
símbolos (la celda debe comenzar con un símbolo de comillas y termina con este símbolo en este caso)La forma más fácil para que C # / Visual Basic trabaje con archivos CSV es usar una
Microsoft.VisualBasic
biblioteca estándar . Solo necesita agregar la referencia necesaria y la siguiente cadena a su clase:Sí, puedes usarlo en C #, no te preocupes. Esta biblioteca puede leer archivos relativamente grandes y admite todas las reglas necesarias, por lo que podrá trabajar con todos los archivos CSV.
Hace algún tiempo escribí una clase simple para lectura / escritura CSV basada en esta biblioteca. Con esta clase simple, podrá trabajar con CSV como con una matriz de 2 dimensiones. Puedes encontrar mi clase en el siguiente enlace: https://github.com/ukushu/DataExporter
Ejemplo simple de uso:
fuente
Para completar las respuestas anteriores, uno puede necesitar una colección de objetos de su archivo CSV, ya sea analizados por
TextFieldParser
elstring.Split
método o por el método, y luego cada línea convertida en un objeto a través de Reflection. Obviamente, primero debe definir una clase que coincida con las líneas del archivo CSV.Utilicé el serializador CSV simple de Michael Kropat que se encuentra aquí: clase genérica a CSV (todas las propiedades) y reutilicé sus métodos para obtener los campos y propiedades de la clase deseada.
Deserializo mi archivo CSV con el siguiente método:
fuente
Recomiendo encarecidamente usar CsvHelper.
Aquí hay un ejemplo rápido:
La documentación completa se puede encontrar en: https://joshclose.github.io/CsvHelper
fuente