C#讀取csv,讀取一行資料的異常問題處理。
阿新 • • 發佈:2018-12-22
多語言檔案 這版用csv格式存放, 自己用C#寫輔助工具時,發現遇到各種問題。 (暫時沒找開源庫,如果有其實直接就行了)。
講一講遇到的幾個坑吧:
1.csv 這邊用 半形逗號, 間隔單元格, 所以如果文字中有半形, " 則這個單元格的資料前後會加上雙引號 "",解析時要注意這個問題。
2. 然後又遇到一個問題, 最開始直接用StreamReader 的ReadLine()讀取一行。 (它 遇到\r \n \r\n 都會結束)
windows中 一般\r\n作為換行符的。 但如果文字中有換行呢?
A. 結果有的單元格文字中 只有一個 \n(前後沒有引號),
B.有的單元格中就是有\r\n的(這個單元格文字 就會有"")
這時 用ReadLine() 就不行了,需要自己寫一個了:
char[] rbuf = new char[BUF_LEN]; string ReadCSVLine(StreamReader sr) { int index = 0; bool quot = false; //是否有落單", 有則表示一行還沒結束 while (index < BUF_LEN) { int r = sr.Read(rbuf, index, 1); if(r == 0) { break; } if(rbuf[index] == '"') { quot = !quot; //遇到一個雙引號取一次反, } if(rbuf[index] == '\n' && index > 0) { if(rbuf[index-1] == '\r') { //讀到csv行尾了, 還要判斷雙引號是否落單 if (!quot) //雙引號都是成雙的,可以結束了 { index--; break; } } } index++; } return new string(rbuf,0,index); }