Leer archivos CSV usando C#
Estoy escribiendo una aplicación de importación simple y necesito leer un archivo CSV, mostrar el resultado DataGrid
y mostrar líneas corruptas del archivo CSV en otra cuadrícula. Por ejemplo, muestre las líneas que tienen menos de 5 valores en otra cuadrícula. Estoy tratando de hacerlo 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 en este caso es muy difícil operar con matrices. ¿Existe una mejor manera de dividir los valores?
No reinventes la rueda. Aproveche lo que ya hay en .NET BCL.
- agregue una referencia a
Microsoft.VisualBasic
(sí, dice VisualBasic pero funciona igual de bien en C#; recuerde que al final todo es solo IL) - use la
Microsoft.VisualBasic.FileIO.TextFieldParser
clase para analizar el archivo CSV
Aquí está el código de ejemplo:
using (TextFieldParser parser = new TextFieldParser(@"c:\temp\test.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();
foreach (string field in fields)
{
//TODO: Process field
}
}
}
Funciona muy bien para mí en mis proyectos de C#.
Aquí hay más enlaces/información:
- MSDN: leer desde archivos de texto delimitados por comas en Visual Basic
- MSDN: clase TextFieldParser
Recomiendo CsvHelper de NuGet .
PD: Con respecto a otras respuestas con más votos positivos, lo siento, pero agregar una referencia Microsoft.VisualBasic
es:
- Feo
- No es multiplataforma, porque no está disponible en .NETCore/.NET5 (y Mono nunca tuvo muy buen soporte para Visual Basic, por lo que puede tener errores).
Mi experiencia es que existen muchos formatos csv diferentes. Especialmente cómo manejan el escape de comillas y delimitadores dentro de un campo.
Estas son las variantes con las que me he topado:
- las comillas están entrecomilladas y duplicadas (Excel), es decir, 15" -> campo1,"15""",campo3
- las comillas no se modifican a menos que el campo se cite por algún otro motivo. es decir, 15" -> campo1,15",campos3
- las comillas se escapan con \. es decir, 15" -> campo1,"15\"",campo3
- las comillas no cambian en absoluto (esto no siempre es posible analizarlo correctamente)
- Se cita el delimitador (Excel). es decir, a,b -> campo1, "a,b", campo3
- El delimitador se escapa con \. es decir, a,b -> campo1,a\,b,campo3
He probado muchos de los analizadores csv existentes, pero no hay ninguno que pueda manejar las variantes con las que me he topado. También es difícil averiguar en la documentación qué variantes de escape admiten los analizadores.
En mis proyectos ahora uso VB TextFieldParser o un divisor personalizado.