使用Regex替换csv列中的\ r \ n

时间:2014-12-22 10:54:19

标签: c# .net regex csv

我的问题如下:

我有一个csv文件,其中列的数据用双引号括起来(") 行尾为\r\n(十六进制值:0D0A)。

我的问题: 列可以包含\r\n(通常是带有运营商返回的书面句子) 当我想在Excel中加载CSV时,这个\ r \ n被理解为一个新行。

我的问题解决方案是: 使用正则表达式执行以下逻辑:

  • 列以双引号开头,以双引号结束
  • 使用\ r \ n
  • 标识一个真正的新行
  • 有问题的列以双引号(")开头,包含\ r \ n并以双引号结束(")

    找到每个有问题的列(使用正则表达式)
    用空格替换\ r \ n(十六进制值:20)

使用regex和c#的任何解决方案?

非常感谢你的帮助

2 个答案:

答案 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,如果行没有任何具有新行的列,则上面的正则表达式将匹配整行/行;如果行具有带新行的某些列,则该行的最后一行将匹配整行/行。我用它来检测哪一行避免追加换行符。