C 獲取csv檔案內容對逗號和引號分隔的處理

2022-04-30 20:42:17 字數 2050 閱讀 2537

2016.10.31

有關正規表示式我進行了修改,完整示例如下: 

string s = string

.empty;

string src = string

.empty;

streamreader fs = new streamreader(new filestream("

d:\\demo.csv

", filemode.open, fileaccess.read), encoding.getencoding("

gb2312

"));

while (!string.isnullorempty(s =fs.readline()))

}console.read();

}fs.close();

正規表示式的效果如下:

在小批量資料匯入的時候,最常用的就是使用excel工具,將資料儲存為xls或csv檔案,然後上傳到伺服器,然後讀取出來通過資料庫訪問類的相關方法更新到資料庫中。對於如何讀取xls檔案的方法,網上太多了,使用excel物件或ole db/odbc連線都行。對於csv檔案,其中有一種方式就是通過檔案流,將它作為文字讀取出來,這其中會遇到一點小意外。

我們知道,使用excel工具儲存成csv檔案時有幾個規則:

1、每一行的單元格內容之間用逗號分隔。

2、如果單元格的內容本身有逗號,這個單元格的內容將會用引號包含。

3、如果單元格的內容本身有引號,

引號不在首或尾,這個單元格內容不會被引號包含。

引號在首或尾,這個單元格內容會被引號包含且原來首尾的引號會被轉義。

所以對於這樣的內容,直接按逗號或引號使用split方法明顯不合適,需要預先處理一下。辦法很多,最容易想到的就是用正則過濾掉本身帶逗號或引號的內容,剩下的再按逗號split就方便了,我將csv檔案中的每一行獲取出來存放到乙個鍵值對的集合中,為了保證前後順序一致,使用sortedlist,這裡用控制台程式示例一下:

1strings =

string

.empty;

2string

src 

=string

.empty;

3sortedlist sl 

=new

sortedlist();

4streamreader fs 

=new

streamreader(

newfilestream(

"demo

.csv

", filemode.open, fileaccess.read), encoding.getencoding(

"gb2312

"));

5while(!

string

.isnullorempty(s 

=fs.readline()))

6).replace("'

", "\

""));

20src 

=src.replace(patn, ",,

");21}

22}2324

string

arr 

=src.split(',

');25for

(inti =

0; i 

<

arr.length; i++)

2630

31idictionaryenumerator ienum 

=sl.getenumerator();

32while

(ienum.movenext())33:

", ienum.key, ienum.value.tostring().replace("'

", "\

"")));35}

36sl.clear();

37src 

=string

.empty;38}

39console.read();40}

41fs.close();

讀取csv檔案時,發現內容文字中也帶有逗號?!

近日參加2019中國高校計算機大賽大資料挑戰賽時,在讀取檔案時就吃了虧。發現文字資料中也有逗號,導致讀取內容亂七八糟。後經思考找到解決方案 由於原資料文字中包含逗號,會導致在讀取資料時發生錯誤,將原本屬於text的誤進行分割。可以在excel中查詢所有的逗號,然後替換成其他符號。附 panda刪除空...

C 對INI檔案讀寫,以及CSV

using system using system.collections.generic using system.linq using system.runtime.interopservices using system.text namespace msframework.common se...

C語言檔案操作 獲取檔案內容

在 c premier plus 中看到乙個文字處理程式,寫的非常精妙,分析一下 include include 要求在命令列中執行程式,並附帶檔名作為引數 int main int argc,char ar if fp fopen ar 1 r null while ch getc fp eof ...