使用逗号分析数据中的CSV

Joe*_*man 8 .net c# csv

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

我自己写了一个CSV解析器,它工作正常,直到我打到这个记录: B002VECGTG,B002VECGTG,HAS_17131_spaceshooter,"4,426",0.04%,"4,832",0.03%,0%,1,0.02%,$20.47 ,1 逃脱,在"4,426"和"4,426"制动我的解析器.

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

            char[] comma = { ',' };
            string[] words = line.Split(comma);
Run Code Online (Sandbox Code Playgroud)

如何防止我的程序破坏?

And*_*bel 11

你不能只用逗号分开.要为该情况实现正确的解析器,您需要自己遍历字符串,跟踪是否在引号内.如果你在一个带引号的字符串中,你应该继续,直到你找到另一个引用.

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++) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此示例将最后一项从列表中删除. (2认同)
  • IEnumerable&lt;string&gt; LineSplitter(string line) { int fieldStart = 0; for (int i = 0; i &lt; line.Length; i++) { if (line[i] == ',') { yield return line.Substring(fieldStart, i - fieldStart); fieldStart = i + 1; } if (line[i] == '"') for (i++; line[i] != '"'; i++) { } } yield return line.Substring(fieldStart, line.Length - fieldStart); } (2认同)

Ode*_*ded 5

我建议使用CSV解析器而不是尝试自己解析.

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

有许多第三方(其中一些是免费的),甚至一个内置在Visual Basic命名空间中 - TextFieldParserMicrosoft.VisualBasic.FileIO命名空间中.