在.NET中读取CSV文件?
如何使用C#读取CSV文件?
没有使用第三方组件的select是使用类Microsoft.VisualBasic.FileIO.TextFieldParser
( http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx )。 它提供了parsingCSV的所有function。 导入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 */ }
您可以使用C#中的Microsoft.VisualBasic.FileIO.TextFieldParser类:
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; }
我只是在我的应用程序中使用这个库。 http://www.codeproject.com/KB/database/CsvReader.aspx 。 一切顺利使用这个库,所以我推荐它。 根据麻省理工学院的许可证是免费的,所以只要在源文件中join通知即可。
我没有在浏览器中显示CSV,但作者有一些样本用于中继器或DataGrid。 我运行了一个testing项目来testing我添加的Sort操作,看起来非常好。
我build议Angara.Table
,关于保存/加载: http : Angara.Table
。
它使列types推断,可以保存CSV文件,并比TextFieldParser快得多。 它遵循CSV格式的RFC4180,支持多行string,NaN和包含分隔字符的转义string。
图书馆在MIT的许可证下。 源代码是https://github.com/Microsoft/Angara.Table 。
虽然它的API专注于F#,但它可以用于任何.NET语言,但不像F#那么简洁。
例:
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");
您可能对CodeProject的 Linq2Csv库感兴趣。 有一点你需要检查的是,如果它只是在需要的时候读取数据,所以在处理更大的文件时你不需要太多的内存。
至于在浏览器上显示数据,你可以做很多事情来完成它,如果你更具体的要求是什么,答案可能更具体,但你可以做的事情:
1.使用HttpListener类编写简单的Web服务器(您可以在网上find许多样本来托pipe迷你HTTP服务器)。
2.使用Asp.Net或Asp.Net Mvc,创build一个页面,使用IIS托pipe它。
似乎有CodeProject或CodePlex的CSVparsing相当多的项目。 这是CodePlex上的另一个CSVparsing器
http://commonlibrarynet.codeplex.com/
这个库有用于CSVparsing,INI文件parsing,命令行parsing的组件。 目前为止我的工作很好。 唯一的事情是它没有一个CSV作家。
这只是parsingCSV。 为了在网页中显示它,只需要根据需要select列表并渲染即可。
注意:此代码示例不处理inputstringline
包含换行符的情况。
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; } }
几年来,我一直在维护一个名为FlatFiles的开源项目。 它可用于.NET Core和.NET 4.5.1。
与大多数替代scheme不同的是,它允许您以极高的精度定义模式(类似于EF代码的工作方式),因此您始终不会遇到转换问题。 您可以直接映射到您的数据类,并且还支持与旧的ADO.NET类连接。
在性能方面,已经被调整为.NET最快的parsing器之一,其中有许多奇怪格式差异的选项。 如果你需要的话,还支持固定长度的文件。