¿Leyendo un archivo CSV en .NET?

¿Cómo leo un archivo CSV usando C #?

Una opción, sin 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 */ } 

Puede usar 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; } 

Podrías probar CsvHelper , que es un proyecto en el que trabajo. Su objective 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(); var records = csv.GetRecords( typeof( MyClass ) ); // Dynamic var records = csv.GetRecords(); // Using anonymous type for the class definition var anonymousTypeDefinition = { Id = default( int ), Name = string.Empty, MyClass = new MyClass() }; var records = csv.GetRecords( anonymousTypeDefinition ); 

Acabo de usar 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 algunas muestras 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.

Recomiendo Angara.Table , sobre guardar / cargar: http://predictionmachines.github.io/Angara.Table/saveload.html .

Realiza inferencias de tipos de columna, 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 usar 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 a = table["a"].Rows.AsReal; ImmutableArray b = table["b"].Rows.AsString; Table.Save(table, "data2.csv"); 

Es posible que esté interesado en 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 podría hacer lo siguiente:
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 usando IIS.

Parece que hay bastantes proyectos en CodeProject o CodePlex para el análisis de CSV. Aquí hay otro analizador CSV en CodePlex

http://commonlibrarynet.codeplex.com/

Esta biblioteca tiene componentes para análisis de CSV, análisis de archivos INI, 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.

Esto es solo para analizar el 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 line cadena de entrada contiene line nuevas.

 public List SplitCSV(string line) { if (string.IsNullOrEmpty(line)) throw new ArgumentException(); List result = new List(); 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; } } 

He estado manteniendo un proyecto de código abierto llamado FlatFiles durante 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 de lucha 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, se ha configurado 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.

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

Un par de formas en que puedes leer archivos CSV

 Id, Name 1, Tom 2, Mark 

Así es como puedes usar esta biblioteca para leerla

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

Si tiene un objeto POCO definido para que coincida con el archivo CSV como se muestra 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 se muestra a continuación

 using (var reader = new ChoCSVReader("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.

Descargo de responsabilidad: soy el autor de esta biblioteca

Usualmente uso un enfoque simplista como este:

 var path = Server.MapPath("~/App_Data/Data.csv"); var csvRows = System.IO.File.ReadAllLines(path, Encoding.Default).ToList(); foreach (var row in csvRows.Skip(1)) { var columns = row.Split(';'); var field1 = columns[0]; var field2 = columns[1]; var field3 = columns[2]; }