使用Regex替换csv列中的 内容

本文关键字:内容 csv Regex 替换 使用 | 更新日期: 2023-09-27 18:35:07

我的问题如下:

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

我的问题:一列可以包含'r'n(它通常是一个带有回车符的书面句子(
当我想在excel中加载CSV时,这''r''n被理解为一个新行。

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

  • 以双引号开头、以双引号结尾的列
  • 一个真正的新行被标识为''r''n
  • 有问题的列以双引号("(开头,包含''r''n并以双引号"结束

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

使用带有c#的regex的任何解决方案

非常感谢您的帮助

使用Regex替换csv列中的
内容

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

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

可能的问题:

如果您的文件有转义的双引号字符,这可能不起作用。你必须测试它。

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