去除csv文件单元格内的逗号

CSV文件协议为 : 如果单元格内有逗号,则该单元格外部用引号括起来,如果单元格内部有引号,则单元格外部用引号括起来,同时单元格内部的引号前面再加上引号
比如 : CSV中的一行为 a,(b,c),d”c,e
实际存储的字符为: a,”(b,c)”,”d”“c”,e
算法思路是基于这个规则,找到从字符串的开始进行遍历,找到两组引号数量一致时,对引号内的逗号进行替换,然后接着往下遍历,该算法有一个漏洞,就是如果CSV某一行存放值为 : “,”,” 即有两个单元格只存放了一个引号,则该算法为错误的认为分隔符逗号是单元格内的,目前还没想到什么好的方法解决.

 //替换逗号的原则,两组引号之间,并且两组引号的个数相同,一组引号遍历完成后,跳到一组
 private static string trimQuote(string source)
        {
            if (string.IsNullOrEmpty(source))
            {
                return source;
            }
            char[] array = source.ToCharArray();
            int len = array.Length;
            int index = 0;
            StringBuilder builder = new StringBuilder();
            while (index < len)
            {
                while (index < len && !array[index].Equals('"'))
                {
                    builder.Append(array[index]);
                    index++;
                }
                int squoteCount = 0;
                while (index < len && array[index].Equals('"'))
                {
                    builder.Append(array[index]);
                    squoteCount++;
                    index++;
                }
                int start = index;
                while (index < len && !array[index].Equals('"'))
                {
                    builder.Append(array[index]);
                    index++;
                }
                int equoteCount = 0;
                while (index < len && array[index].Equals('"'))
                {
                    builder.Append(array[index]);
                    equoteCount++;
                    index++;
                }
                int end = index;
                if (squoteCount > 0 && squoteCount == equoteCount)
                {
                    int pos = start;
                    while (pos < end)
                    {
                        if (array[pos].Equals(','))
                        {
                            array[pos] = '#';
                        }
                        pos++;
                    }
                }
            }
            string cc = new string(array);
            return cc.Replace("#", "");
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值