如何使用Regex解析不规则的CSV而不选择某些字符

时间:2016-04-06 14:10:34

标签: regex

我必须处理奇怪的CSV格式,而且我遇到了问题。到目前为止我能够解决的字符串是

(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*?)+?

我的文件经常被破坏和不规则,因为我们必须处理OCR文本,而这些文本通常不会被我们的用户检查。因此,我们倾向于结束许多奇怪的事情,比如单个“在一个字段内,甚至是一个换行符(这就是为什么我使用Regex而不是我以前的readLine()为基础的解决方案)。我已经得到了它能正确地解析大部分内容,除了它捕获[,] [,]。如何才能使它只选择只有一个逗号的字段?当我尝试不选择逗号时,它会将“156,000”变为[156] ]和[000]

我一直在使用的测试字符串是

"156,000","",""i","parts","dog"","","Monthly "running" totals"

理想的欲望捕获输出是

[156,000],[],[i],[parts],[dog],[],[Monthly "running" totals]

我可以使用或不使用内部引号,因为我总是可以在处理期间剥离它们。

非常感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您的CSV确实不规则且难以解析。我建议您先对数据进行2次替换。

// remove all invalid double ""
input = Regex.Replace(input, @"(?<!,|^)""(?=,|$)|(?<=,)""(?!,|$)", "\"");

// now escape all inner "
input = Regex.Replace(input, @"(?<!,|^)"(?!,|$)", @"\\\"");

// at this stage your have proper CSV data and I suggest using a good .NET csv parser
// to parse your data and get individual values

Replacement 1 demo

Replacement 2 demo