原文:http://blog.csdn.net/dannywj1371/article/details/7217588
速度快,方便。
在c#中读取csv文件可以使用OLEDB当作数据库来读取,或者一行行的读取,然后使用正则表达式进行解析。使用oledb一般情况下也比较方便,但是效率不是很好,特别是csv文件很大的情况下。如果一行行的读取,对数据字段进行拆分是个难题,一般情况下使用英文逗号就可以了,但是很多情况下字段的内容也都包含了逗号,还有可能一条数据要占用多行。今天推荐一个别人封装好的csv读取类库:CSVReader,可以快速方便的处理csv数据。
类库作者开发这个程序经历了很多年了,最近还在更新中。点击下面的地址到官方网站:
http://www.codeproject.com/KB/database/CsvReader.aspx
这个程序的最大特点是速度快,按照作者的说法比使用OLEDB和正则表达式的方法大约快15倍,而且内存使用较少。举一个例子,在CPU P4 3.0 GHz, 内存1024 MB的电脑上,一个45M的csv文件,145个字段,5万条记录,用时大约1.5秒,每秒钟处理大约30M数据。当然肯定不是每次都这么快,影响的因素比较多,咱也不要较真。
这个程序还有一个特点是可以处理多行数据,前提是数据必须引用起来。
这个程序本质上也是按行读取的,在读取的时候会为当前记录保存一个字段缓存。作者还提供了一个类CachedCsvReader会将csv文件内容全部缓存到内存,然后从缓存中读取。
说了这么多,看看例子吧:
1、基本用法
using LumenWorks.Framework.IO.Csv; |
new CsvReader( new StreamReader( "data.csv" ), true )) //中文文件的处理!!! CsvReader csv = new CsvReader(new StreamReader(fileLocation, Encoding.Default, true), true); |
int fieldCount = csv.FieldCount; |
string [] headers = csv.GetFieldHeaders(); |
while (csv.ReadNextRecord()) |
for ( int i = 0; i < fieldCount; i++) |
Console.Write( string .Format( "{0} = {1};" , |
2、简单数据绑定(ASP.NET)
using LumenWorks.Framework.IO.Csv; |
using (CsvReader csv = new CsvReader( |
new StreamReader( "data.csv" ), true )) |
myDataRepeater.DataSource = csv; |
myDataRepeater.DataBind(); |
对于DataGrid和GridView不能使用,原因是效率问题和控件的内部机制无法满足。具体说明看上边提供的网址。
3、复杂数据绑定(Windows Forms)
using LumenWorks.Framework.IO.Csv; |
using (CachedCsvReader csv = new |
CachedCsvReader( new StreamReader( "data.csv" ), true )) |
myDataGrid.DataSource = csv; |
4、自定义错误处理
using LumenWorks.Framework.IO.Csv; |
using (CsvReader csv = new CsvReader( |
new StreamReader( "data.csv" ), true )) |
csv.MissingFieldAction = MissingFieldAction.ReplaceByNull; |
int fieldCount = csv.FieldCount; |
string [] headers = csv.GetFieldHeaders(); |
while (csv.ReadNextRecord()) |
for ( int i = 0; i < fieldCount; i++) |
Console.Write( string .Format( "{0} = {1};" , |
csv[i] == null ? "MISSING" : csv[i])); |
5、自定义错误触发事件
using LumenWorks.Framework.IO.Csv; |
using (CsvReader csv = new CsvReader( |
new StreamReader( "data.csv" ), true )) |
csv.DefaultParseErrorAction = ParseErrorAction.RaiseEvent; |
csv.ParseError += new ParseErrorEventHandler(csv_ParseError); |
int fieldCount = csv.FieldCount; |
string [] headers = csv.GetFieldHeaders(); |
while (csv.ReadNextRecord()) |
for ( int i = 0; i < fieldCount; i++) |
Console.Write( string .Format( "{0} = {1};" , |
void csv_ParseError( object sender, ParseErrorEventArgs e) |
if (e.Error is MissingFieldCsvException) |
Console.Write( "--MISSING FIELD ERROR OCCURRED" ); |
e.Action = ParseErrorAction.AdvanceToNextLine; |
使用起来还是挺方便的,赶紧试试吧。