c#逗号分隔字符串到列表

时间:2017-01-01 04:07:21

标签: c# arrays string list csv

我已经看到了一些使用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

谢谢

3 个答案:

答案 0 :(得分:0)

使用正则表达式来执行此操作。这是最快捷,最简单的方式。请务必在参考文献中添加System.Text.RegularExpressions。将单引号和双引号作为特殊字符,将它们删除。有关详细信息,请参阅此帖子。

Regex remove special characters

答案 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();
}

它还处理包含正确转义引号的值。