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')  // 有\r\n的情况
                    {
                        //读到csv行尾了, 还要判断双引号是否落单
                        if (!quot)   //双引号都是成双的,可以结束了
                        {
                            index--;    //去掉 \r
                            break;
                        }
                    }
                    else    \\只有\n的情况
                    {
                        //读到csv行尾了, 还要判断双引号是否落单
                        if (!quot)   //双引号都是成双的,可以结束了
                        {
                            //index--;
                            break;
                        }
                    }
                }
                index++;
            }
            return new string(rbuf,0,index);
        }

 

你可能感兴趣的:(C#读取csv,读取一行数据的异常问题处理。)