我的问题如下:
我有一个csv文件,其中列的数据用双引号括起来(")
行尾为\r\n
(十六进制值:0D0A
)。
我的问题:
列可以包含\r\n
(通常是带有运营商返回的书面句子)
当我想在Excel中加载CSV时,这个\ r \ n被理解为一个新行。
我的问题解决方案是: 使用正则表达式执行以下逻辑:
有问题的列以双引号(")开头,包含\ r \ n并以双引号结束(")
找到每个有问题的列(使用正则表达式)
用空格替换\ r \ n(十六进制值:20)
端
使用regex
和c#的任何解决方案?
非常感谢你的帮助
答案 0 :(得分:1)
我无法想到找到有问题的条目的简单方法(并不意味着没有任何问题),但有一种简单的方法可以找到用双引号括起来的所有条目。然后,如果它们是ptoblematic,您可以更改它们:
var result = Regex.Replace(input, @"""(?:(\r\n)|[^""])+""", delegate(Match m)
{
if (string.IsNullOrEmpty(m.Groups[1].Value))
return m.Value;
return m.Value.Replace("\r\n", " ");
});
可能出现的问题:
如果您的文件已转义双引号字符,则可能无效。你必须测试它。
答案 1 :(得分:0)
我假设CSV文件首先有效,双引号"
字符不属于该字段。
第一个假设对于减少这里的工作很重要。如果不成立,最好使用CSV解析器解析文件,然后在每个列上进行替换。
如果您知道双引号如何在CSV中转义,则可以通过一个小修改删除第二个假设。如果"
指定了""
,请将下面代码中的[^\"]
更改为(?:[^\"]|\"\")
。如果"
指定了\"
,请将以下代码中的[^\"]
更改为(?:[^\\\\\"]|\\\\.)
。
逐行阅读文件并按如下方式处理:
if (Regex.IsMatch(line, "^\"?[^\"]*\"(,\"[^\"]*\")*$")) {
// Write the current line to file with line ending
} else {
// Write the current line to file without line ending
}
为了便于理解,让我删除字符串文字转义:
^"?[^"]*"(,"[^"]*")*$
对于有效的CSV,如果行没有任何具有新行的列,则上面的正则表达式将匹配整行/行;如果行具有带新行的某些列,则该行的最后一行将匹配整行/行。我用它来检测哪一行避免追加换行符。