Leer archivos CSV usando C#

Resuelto ilkin asked hace 14 años • 12 respuestas

Estoy escribiendo una aplicación de importación simple y necesito leer un archivo CSV, mostrar el resultado DataGridy 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?

ilkin avatar Aug 18 '10 05:08 ilkin
Aceptado

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.TextFieldParserclase 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
David Pokluda avatar Aug 18 '2010 02:08 David Pokluda

Recomiendo CsvHelper de NuGet .



PD: Con respecto a otras respuestas con más votos positivos, lo siento, pero agregar una referencia Microsoft.VisualBasices:

  • 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).
knocte avatar Dec 10 '2015 08:12 knocte

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.

adrianm avatar Aug 18 '2010 09:08 adrianm