2009-09-10 23 views
29

¿Cómo leo un archivo CSV usando C#?¿Lectura de un archivo CSV en .NET?

+6

http://stackoverflow.com/questions/1898/csv-file-imports-in-net http://stackoverflow.com/questions/938291/import-csv-file-into-c http://stackoverflow.com/questions/316649/csv-parsing http://stackoverflow.com/questions/1047531/splitting-comma-seperated-values-csv http : //stackoverflow.com/questions/1103495/is-there-a-proper-way-to-read-csv-files –

+3

[¿Top 6 formas de analizar .CSV? Alto rendimiento!] (Http://izlooite.blogspot.com/2011/06/top-6-ways-to-parse-csv-high.html) –

Respuesta

1

Puede que le interese la biblioteca Linq2Csv en CodeProject. Una cosa que necesitaría verificar es si está leyendo los datos cuando solo necesita, por lo que no necesitará mucha memoria cuando trabaje con archivos más grandes.

En cuanto a la visualización de los datos en el navegador, podría hacer muchas cosas para lograrlo, si fuera más específico sobre cuáles son sus requisitos, la respuesta podría ser más específica, pero cosas que podría hacer:
1. Use la clase HttpListener para escribir un servidor web simple (puede encontrar muchas muestras en la red para alojar el servidor mini-http).
2. Use Asp.Net o Asp.Net Mvc, cree una página, hágalo mediante IIS.

4

Acabo de utilizar esta biblioteca en mi aplicación. http://www.codeproject.com/KB/database/CsvReader.aspx. Todo funcionó sin problemas usando esta biblioteca, así que lo estoy recomendando. Es gratis bajo la Licencia MIT, así que solo incluya el aviso con sus archivos fuente.

No visualicé el CSV en un navegador, pero el autor tiene algunos ejemplos para Repetidores o DataGrids. Ejecuté uno de sus proyectos de prueba para probar una operación de clasificación que agregué y se veía bastante bien.

1

Esto es solo para analizar el archivo CSV. Para mostrarlo en una página web, es simplemente una cuestión de tomar la lista y representarla como lo desee.

Nota: Este ejemplo de código no maneja la situación donde la cadena de entrada line contiene líneas nuevas.

public List<string> SplitCSV(string line) 
{ 
    if (string.IsNullOrEmpty(line)) 
     throw new ArgumentException(); 

    List<string> result = new List<string>(); 

    int index = 0; 
    int start = 0; 
    bool inQuote = false; 
    StringBuilder val = new StringBuilder(); 

    // parse line 
    foreach (char c in line) 
    { 
     switch (c) 
     { 
      case '"': 
       inQuote = !inQuote; 
       break; 

      case ',': 
       if (!inQuote) 
       { 
        result.Add(line.Substring(start, index - start) 
         .Replace("\"","")); 

        start = index + 1; 
       } 

       break; 
      } 

      index++; 
     } 

     if (start < index) 
     { 
      result.Add(line.Substring(start, index - start).Replace("\"","")); 
     } 

     return result; 
    } 
} 
+2

Tampoco maneja el uso de caracteres de comillas dobles dentro de un valor. CSV tiene muchos casos extremos, lo mejor es simplemente usar una biblioteca. – Arafangion

1

Parece que hay bastantes proyectos en CodeProject o CodePlex para CSV Parsing. Aquí hay otro analizador CSV en CodePlex

http://commonlibrarynet.codeplex.com/

Esta biblioteca tiene componentes para el análisis CSV, INI archivo de análisis, análisis de línea de comandos también. Me está funcionando bien hasta ahora. Lo único es que no tiene un escritor de CSV.

+2

Solo un FYI: la licencia en el sitio dice que es MIT, pero en el código fuente en sí, todos los archivos relacionados con Csv tienen una licencia LGPL prominente en la parte superior. –

4

Puede probar CsvHelper, que es un proyecto en el que trabajo. Su objetivo es hacer que leer y escribir archivos CSV sea lo más fácil posible, a la vez que muy rápido.

Aquí hay algunas maneras en que puede leer un archivo CSV.

// By type 
var records = csv.GetRecords<MyClass>(); 
var records = csv.GetRecords(typeof(MyClass)); 

// Dynamic 
var records = csv.GetRecords<dynamic>(); 

// Using anonymous type for the class definition 
var anonymousTypeDefinition = 
{ 
    Id = default(int), 
    Name = string.Empty, 
    MyClass = new MyClass() 
}; 
var records = csv.GetRecords(anonymousTypeDefinition); 
43

una elección, sin necesidad de utilizar componentes de terceros, es utilizar la clase Microsoft.VisualBasic.FileIO.TextFieldParser (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx). Proporciona todas las funciones para analizar CSV. Es suficiente importar el ensamblado Microsoft.VisualBasic.

var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(file); 
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited; 
parser.SetDelimiters(new string[] { ";" }); 

while (!parser.EndOfData) 
{ 
    string[] row = parser.ReadFields(); 
    /* do something */ 
} 
+0

Para leer archivos CSV y proporcionar el análisis usted mismo, esto es ideal. Simple, pero con todas las funciones, incluidos los valores cotizados en múltiples líneas. – ErikHeemskerk

+0

Esta es mi solución favorita lista para usar – Habeeb

16

Puede utilizar la clase Microsoft.VisualBasic.FileIO.TextFieldParser en C#:

using System; 
using System.Data; 
using Microsoft.VisualBasic.FileIO; 

static void Main() 
{ 
    string csv_file_path = @"C:\Users\Administrator\Desktop\test.csv"; 

    DataTable csvData = GetDataTableFromCSVFile(csv_file_path); 

    Console.WriteLine("Rows count:" + csvData.Rows.Count);  
    Console.ReadLine(); 
} 

private static DataTable GetDataTableFromCSVFile(string csv_file_path) 
{ 
    DataTable csvData = new DataTable(); 

    try 
    { 
     using(TextFieldParser csvReader = new TextFieldParser(csv_file_path)) 
     { 
      csvReader.SetDelimiters(new string[] { "," }); 
      csvReader.HasFieldsEnclosedInQuotes = true; 
      string[] colFields = csvReader.ReadFields(); 

      foreach (string column in colFields) 
      { 
       DataColumn datecolumn = new DataColumn(column); 
       datecolumn.AllowDBNull = true; 
       csvData.Columns.Add(datecolumn); 
      } 

      while (!csvReader.EndOfData) 
      { 
       string[] fieldData = csvReader.ReadFields(); 
       //Making empty value as null 
       for (int i = 0; i < fieldData.Length; i++) 
       { 
        if (fieldData[i] == "") 
        { 
         fieldData[i] = null; 
        } 
       } 

       csvData.Rows.Add(fieldData); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
    } 

    return csvData; 
} 
+0

Esta biblioteca es mi solución favorita lista para usar. – Habeeb

+0

Lo único que cambié de este ejemplo fue un cheque para el mismo nombre de columna y agregué un código para mostrar la excepción – andrewjboyd

2

recomiendo Angara.Table, sobre guardar/carga: http://predictionmachines.github.io/Angara.Table/saveload.html.

Hace la inferencia de tipos de columnas, puede guardar archivos CSV y es mucho más rápido que TextFieldParser.Sigue RFC4180 para formato CSV y admite cadenas de varias líneas, NaN y cadenas escapadas que contienen el carácter delimitador.

La biblioteca está bajo licencia de MIT. El código fuente es https://github.com/Microsoft/Angara.Table.

Aunque su API se centra en F #, se puede utilizar en cualquier lenguaje .NET pero no tan breve como en F #.

Ejemplo:

using Angara.Data; 
using System.Collections.Immutable; 

... 

var table = Table.Load("data.csv"); 

// Print schema: 
foreach(Column c in table) 
{ 
    string colType; 
    if (c.Rows.IsRealColumn) colType = "double"; 
    else if (c.Rows.IsStringColumn) colType = "string"; 
    else if (c.Rows.IsDateColumn) colType = "date"; 
    else if (c.Rows.IsIntColumn) colType = "int"; 
    else colType = "bool"; 

    Console.WriteLine("{0} of type {1}", c.Name, colType); 
} 

// Get column data: 
ImmutableArray<double> a = table["a"].Rows.AsReal; 
ImmutableArray<string> b = table["b"].Rows.AsString; 

Table.Save(table, "data2.csv"); 
0

vengo sosteniendo un proyecto de código abierto llamado desde hace varios años. Está disponible para .NET Core y .NET 4.5.1.

A diferencia de la mayoría de las alternativas, le permite definir un esquema (similar al modo en que funciona el código EF) con un nivel extremo de precisión, para que no tenga problemas de conversión todo el tiempo. Puede mapear directamente a sus clases de datos, y también hay soporte para interactuar con clases anteriores de ADO.NET.

En cuanto a rendimiento, ha sido sintonizado para ser uno de los analizadores más rápidos para .NET, con una gran cantidad de opciones para diferencias de formato extravagantes. También hay soporte para archivos de longitud fija, si lo necesita.

+0

Lectura recomendada: [¿Cómo puedo ofrecer bibliotecas de código abierto personal?] (// meta.stackexchange.com/q/229085) –

0

Puede probar Cinchoo ETL - una lib de código abierto para leer y escribir archivos CSV.

par de maneras que usted puede leer archivos CSV

Id, Name 
1, Tom 
2, Mark 

Esto es cómo se puede utilizar esta biblioteca para leerlo

using (var reader = new ChoCSVReader("emp.csv").WithFirstLineHeader()) 
{ 
    foreach (dynamic item in reader) 
    { 
     Console.WriteLine(item.Id); 
     Console.WriteLine(item.Name); 
    } 
} 

Si tiene objetos POCO definido para que coincida con el archivo CSV como a continuación

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

puede analizar el mismo archivo usando esta clase POCO como a continuación

using (var reader = new ChoCSVReader<Employee>("emp.csv").WithFirstLineHeader()) 
{ 
    foreach (var item in reader) 
    { 
     Console.WriteLine(item.Id); 
     Console.WriteLine(item.Name); 
    } 
} 

Consulte los artículos en CodeProject sobre cómo usarlo.

responsabilidad: yo soy el autor de esta biblioteca