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("#", "");
}