文件無法加載插件怎么辦,.NET處理CSV文件 插件CSVReader

 2023-11-30 阅读 27 评论 0

摘要:原文:http://blog.csdn.net/dannywj1371/article/details/7217588 速度快,方便。 在c#中讀取csv文件可以使用OLEDB當作數據庫來讀取,或者一行行的讀取,然后使用正則表達式進行解析。使用oledb一般情況下也比較方便,但是效率不是很好࿰

原文: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?System.IO;
using?LumenWorks.Framework.IO.Csv;
?
void?ReadCsv()
{
// 打開"data.csv" ,這個csv文件應該有一個標題行
using?(CsvReader csv =
new?CsvReader(newStreamReader("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?(inti = 0; i < fieldCount; i++)
Console.Write(string.Format("{0} = {1};",
headers[i], csv[i]));
?
Console.WriteLine();
}
}
}

2、簡單數據綁定(ASP.NET)

using?System.IO;
using?LumenWorks.Framework.IO.Csv;
?
void?ReadCsv()
{
// 打開"data.csv" ,這個csv文件應該有一個標題行
using?(CsvReader csv =new?CsvReader(
new?StreamReader("data.csv"),true))
{
myDataRepeater.DataSource = csv;
myDataRepeater.DataBind();
}
}

對于DataGrid和GridView不能使用,原因是效率問題和控件的內部機制無法滿足。具體說明看上邊提供的網址。
3、復雜數據綁定(Windows Forms)

using?System.IO;
using?LumenWorks.Framework.IO.Csv;
?
void?ReadCsv()
{
????// 打開"data.csv" ,這個csv文件應該有一個標題行
????using(CachedCsvReader csv =?new
???????????CachedCsvReader(newStreamReader("data.csv"),true))
????{
????????//?字段 標題將自動作為列的名稱
????????myDataGrid.DataSource = csv;
????}
}

4、自定義錯誤處理

using?System.IO;
using?LumenWorks.Framework.IO.Csv;
?
void?ReadCsv()
{
????//??打開"data.csv" ,這個csv文件應該有一個標題行
????using(CsvReader csv =?new?CsvReader(
???????????newStreamReader("data.csv"),true))
????{
????????// 丟失的字段將不會拋出異常,而被當作一個null值處理
????????csv.MissingFieldAction = MissingFieldAction.ReplaceByNull;
?
????????// 丟失的字段將不會拋出異常,而被當作一個null值處理
????????//csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;
?
????????intfieldCount = 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?System.IO;
using?LumenWorks.Framework.IO.Csv;
?
void?ReadCsv()
{
????// open the file "data.csv" which is a CSV file with headers
????using(CsvReader csv =?new?CsvReader(
???????????newStreamReader("data.csv"),true))
????{
????????//?格式化字段出錯時,觸發事件csv_ParseError
?
???????csv.DefaultParseErrorAction = ParseErrorAction.RaiseEvent;
????????csv.ParseError +=new?ParseErrorEventHandler(csv_ParseError);
?
????????intfieldCount = 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(objectsender, ParseErrorEventArgs e)
{
????// 如果錯誤是字段不存在,則跳轉到下一行
????if(e.Error?is?MissingFieldCsvException)
????{
????????Console.Write("--MISSING FIELD ERROR OCCURRED");
????????e.Action = ParseErrorAction.AdvanceToNextLine;
????}
}

使用起來還是挺方便的,趕緊試試吧。



版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/187520.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息