如何解析具有引用值但没有换行符的 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有同样的问题。如果在引用的字段之一中嵌入了<sp><sp>
,它将被识别为“行尾”
@Flydog57 你是对的。我不认为在提供样本的数据集中会出现这种情况。我认为在这种情况下 reg ex 是最好的方法。以上是关于如何解析具有引用值但没有换行符的 csv 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章