如何解析具有引用值但没有换行符的 csv 文件? [复制]

Posted

技术标签:

【中文标题】如何解析具有引用值但没有换行符的 csv 文件? [复制]【英文标题】:How can I parse a csv file that has quoted values but no line breaks? [duplicate] 【发布时间】:2020-05-02 19:15:10 【问题描述】:

如何使用 C# 解析这样的 csv 文件?

"TeamName","PlayerName","Position"  "Chargers","Philip Rivers","QB"  "Colts","Peyton Manning","QB"  "Patriots","Tom Brady","QB"

请注意,自然换行符为零。位于值之外的双空格将一行与另一行区分开来。


相关:

line breaks lost in sql server How do you view ALL text from an ntext or nvarchar(max) in SSMS?

【问题讨论】:

该文件是否有可能只有\n (LF),没有\r (CR),并且您在无法识别Unix 换行符的编辑器中打开它?或者也许它使用另一个字符作为记录分隔符?只是想在采取可能被视为极端措施之前排除这种可能性。 我认为您将需要创建一个正则表达式来解析行(类似于("[^"]*",)*("[^"]*" )(不包括最后一行)。一旦将行解析为行,其余的很容易 怎么样:查找:(".*?"(?:,".*?")*) 替换:$1\n 【参考方案1】:

在 cmets 中使用 @toto 的想法(和我的),这样的事情怎么样。

使用正则表达式解析每一行,然后将每一行的内容通过在每行末尾添加"\r\n" 使其成为一行。

 const string input =
     "\"TeamName\",\"PlayerName\",\"Position\"  \"Chargers\",\"Philip Rivers\",\"QB\"  \"Colts\",\"Peyton Manning\",\"QB\"  \"Patriots\",\"Tom Brady\",\"QB\"";
 const string linePattern = "(?<Line>(\"[^\"]+\",?)+)  ";
 var lineRegex = new Regex(linePattern);

 var linesText = lineRegex.Replace(input, "$Line\r\n");

最后,linesText 看起来像一个常规的引号分隔的 CSV 文件,您可以使用常规工具对其进行解析。如果我运行这段代码,这就是linesText 的样子:

"TeamName","PlayerName","Position"
"Chargers","Philip Rivers","QB"
"Colts","Peyton Manning","QB"
"Patriots","Tom Brady","QB"

【讨论】:

【参考方案2】:

您可以尝试以下方法。

        var content = File.ReadAllText(@"path/to/csv").Replace("  ", ";");
        var result = content.Split(';');
        foreach (var str in result)
        
            Console.WriteLine(str);

        

【讨论】:

这和@kit有同样的问题。如果在引用的字段之一中嵌入了&lt;sp&gt;&lt;sp&gt;,它将被识别为“行尾” @Flydog57 你是对的。我不认为在提供样本的数据集中会出现这种情况。我认为在这种情况下 reg ex 是最好的方法。

以上是关于如何解析具有引用值但没有换行符的 csv 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何用Java解析CSV文件

在引用的 csv 中匹配未转义的引号

Boost tokenizer 无法解析具有双引号字段的 csv 文件

在未引用的字段错误中看到 CSV 换行符

如何比较具有不同名称引用但具有相同实际数据的两个列表

Bash:使用引号、逗号和换行符解析 CSV