分析数据中带有逗号的CSV

本文关键字:CSV 数据 | 更新日期: 2023-09-27 18:08:58

可能重复:
处理CSV文件中的逗号

我给自己写了一个CSV解析器,它运行良好,直到我达到这个记录:B002VECGTG,B002VECGTG,HAS_17131_spaceshooter,"4,426",0.04%,"4,832",0.03%,0%,1,0.02%,$20.47 ,1在"4426"answers"4426"中的escaped使我的解析器刹车。

这就是我用来解析文本行的内容:

            char[] comma = { ',' };
            string[] words = line.Split(comma);

如何防止程序中断?

分析数据中带有逗号的CSV

不能只使用逗号进行拆分。为了为这种情况实现一个合适的解析器,您需要自己循环遍历字符串,跟踪您是否在引号内。如果你在一个带引号的字符串中,你应该继续,直到找到另一个引号。

IEnumerable<string> LineSplitter(string line)
{
    int fieldStart = 0;
    for(int i = 0; i < line.Length; i++)
    {
        if(line[i] == ',')
        {    
            yield return line.SubString(fieldStart, i - fieldStart);
            fieldStart = i + 1;
        }
        if(line[i] == '"')
            for(i++; line[i] != '"'; i++) {}
    }
}

我建议使用CSV解析器,而不是自己解析。

正如您已经发现的,正确解析CSV有一些细微差别。

有许多第三方名称空间(其中一些是免费的(,甚至还有一个内置在Visual Basic名称空间中——Microsoft.VisualBasic.FileIO名称空间中的TextFieldParser

可以使用Regex:

List<List<String>> rows = new List<List<String>>();
MatchCollection matches = Regex.Matches(input, @"^(?:(?:'s*""(?<value>[^""]*)""'s*|(?<value>[^,]*)),)*?(?:'s*""(?>value>[^""]*)""'s*|(?<value>[^,]*))$", RegexOptions.Multiline);
foreach(Match row in matches)
{
    List<String> values = new List<String>();
    foreach(Capture value in row.Groups["value"].Captures)
    {
        values.Add(value.Value);
    }
    rows.Add(values);
}

我并不认为这是最好的解决方案,但对于小文件(几行(来说,这可能还不错。