我已经看到了一些使用Split(',')处理逗号分隔列表的示例,其中包含以下字符串:
string csv = "1,2,3,4,a,5";
List<string> parts = csv.Split(',').ToList<string>();
但是会发生什么,以及如何处理这样的CSV字符串:
string csv = '"a,b","c,d","e","f",g,h,i';
我希望能够将csv字符串解析为列表或数组,更多的是了解处理包含逗号的字符串元素的最佳方法,而不是像Split这样的简单解析器对额外的逗号感到困惑。
阿列克谢的评论很有帮助,但在我的现实生活中尝试之后,他的解决方案陷入了一些障碍......所以需要额外的功劳......这是一个需要解析的更准确的csv字符串。 / p>
csv = '"name 1" <title 1>, "name, 2" <title 2>, name 3 <title 3>, name 4 <title 4>, name 5, name 6';
这些值将分为:
"name 1" <title 1>
"name, 2" <title 2>
name 3 <title 3>
name 4 <title 4>
name 5
name 6
谢谢
答案 0 :(得分:0)
使用正则表达式来执行此操作。这是最快捷,最简单的方式。请务必在参考文献中添加System.Text.RegularExpressions
。将单引号和双引号作为特殊字符,将它们删除。有关详细信息,请参阅此帖子。
答案 1 :(得分:0)
第二个字符串的普通C#解决方案。它假定它是一个有效的CSV,令牌之间没有空格。我不认为它是最快的,但它应该足够合理大小的数组(~MB)。复杂性为O(n)
:
private static void AddToBuilder(IList<string> parts, StringBuilder sb)
{
if (sb.Length > 0)
parts.Add(sb.ToString());
sb.Clear();
}
static void Main(string[] args)
{
string csv = "\"a,b\",\"c,d\",\"e\",\"f\",g,h,i";
var parts = new List<string>();
bool innerString = false;
var sb = new StringBuilder();
foreach (var c in csv)
{
if (c == '\"')
{
if (innerString)
AddToBuilder(parts, sb);
innerString = !innerString;
continue;
}
if (c == ',' && !innerString)
{
AddToBuilder(parts, sb);
continue;
}
sb.Append(c);
}
AddToBuilder(parts, sb);
答案 2 :(得分:0)
如果第三方CSV解析器不是一个选项,另一种选择是Microsoft.VisualBasic.FileIO.TextFieldParser
(需要参考Microsoft.VisualBasic
):
string CSV = "\"a,b\",\"c,d\",\"e\",\"f\",g,h,i";
string[] fields;
using (var sr = new System.IO.StringReader(CSV))
using (var tfp = new Microsoft.VisualBasic.FileIO.TextFieldParser(sr)) {
tfp.SetDelimiters(",");
fields = tfp.ReadFields();
}
它还处理包含正确转义引号的值。