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);
        }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值