1. 程式人生 > >C#讀取csv,讀取一行資料的異常問題處理。

C#讀取csv,讀取一行資料的異常問題處理。

多語言檔案 這版用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);
        }