我有一个CSV字符串,我想把它分成一个数组。但是,CSV是字符串和数字的混合,其中字符串用引号括起来,可能包含逗号。
例如,我可能有如下CSV:
1,"Hello",2,"World",3,"Hello, World"
我希望它能将字符串分成:
1
"Hello"
2
"World"
3
"Hello, World"
如果我使用String.Split(',');
,我会:
1
"Hello"
2
"World"
3
"Hello
World"
有一种简单的方法吗?已编写的库或是否必须按字符解析字符串?
答案 0 :(得分:6)
关于代码项目的"A Fast CSV Reader"文章。我已多次愉快地使用它了。
答案 1 :(得分:2)
String.Split()对此很苛刻。它不仅有令人讨厌的角落情况,它不像你刚发现的那样(还有其他你还没有看到的),但性能也不太理想。其他人发布的FastCSVReader可以工作,框架中内置了一个不错的csv解析器(Microsoft.VisualBasic.TextFieldParser),我有一个简单的解析器,行为正确发布到this question。
答案 2 :(得分:1)
我建议使用以下解决方案之一,只测试其中一些(因此延迟): -
希望这有帮助。
答案 3 :(得分:1)
这不是最优雅的解决方案,但如果您想快速复制和粘贴代码(避免导入DLL或其他代码库),则最快:
private string[] splitQuoted(string line, char delimeter)
{
string[] array;
List<string> list = new List<string>();
do
{
if (line.StartsWith("\""))
{
line = line.Substring(1);
int idx = line.IndexOf("\"");
while (line.IndexOf("\"", idx) == line.IndexOf("\"\"", idx))
{
idx = line.IndexOf("\"\"", idx) + 2;
}
idx = line.IndexOf("\"", idx);
list.Add(line.Substring(0, idx));
line = line.Substring(idx + 2);
}
else
{
list.Add(line.Substring(0, Math.Max(line.IndexOf(delimeter), 0)));
line = line.Substring(line.IndexOf(delimeter) + 1);
}
}
while (line.IndexOf(delimeter) != -1);
list.Add(line);
array = new string[list.Count];
list.CopyTo(array);
return array;
}