原文: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};" , |
?????????????????????????????? headers[i], |
?????????????????????????????? csv[i] == null ??? "MISSING" : csv[i])); |
???????????? Console.WriteLine(); |
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};" , |
?????????????????????????????? headers[i], csv[i])); |
???????????? Console.WriteLine(); |
void ?csv_ParseError( object sender, ParseErrorEventArgs e) |
???? if (e.Error? is ?MissingFieldCsvException) |
???????? Console.Write( "--MISSING FIELD ERROR OCCURRED" ); |
???????? e.Action = ParseErrorAction.AdvanceToNextLine; |
使用起來還是挺方便的,趕緊試試吧。