【问题标题】:Replace \r\n in a csv column using Regex使用正则表达式替换 csv 列中的 \r\n
【发布时间】:2014-12-22 10:54:18
【问题描述】:

我的问题如下:

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

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

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

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

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

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

非常感谢您的帮助

【问题讨论】:

  • 感谢您的快速评论,但我希望能够使用正则表达式完成算法。如何找到有问题的列?

标签: c# .net regex csv


【解决方案1】:

我想不出简单的方法来找到有问题的条目(并不意味着没有),但是有一种简单的方法可以找到用双引号括起来的所有条目。然后,如果它们有问题,您可以更改它们:

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", " ");
            });

可能的问题:

如果您的文件已转义双引号字符,这可能不起作用。您必须对其进行测试。

【讨论】:

    【解决方案2】:

    我首先假设 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,如果该行没有任何带有新行的列,则上面的正则表达式将匹配整行/行,或者如果该行有一些带有新行的列,则该行的最后一行。我用它来检测哪一行来避免添加换行符。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2017-11-17
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多