【问题标题】:Regular expression to find and replace unescaped Non-successive double quotes in CSV file用于查找和替换 CSV 文件中未转义的非连续双引号的正则表达式
【发布时间】:2011-03-11 23:38:22
【问题描述】:

这是对已回答的相关问题的扩展 Here

我有一个需要解析的每周 csv 文件。它看起来像这样。

"asdf","asdf","asdf","asdf"

但有时有些文本字段包含一个额外的非转义双引号字符串

"asdf","as "something" df","asdf","asdf"

从这里的其他帖子中,我能够整理出一个正则表达式

(?m)""(?![ \t]*(,|$))

匹配两个连续的双引号,只有“如果它们前面没有逗号或行尾,中间有可选的空格和制表符”

现在这只会找到连续的双引号。如何修改它以查找和替换/删除文件中“某物”周围的双引号?

谢谢。

【问题讨论】:

  • 无论您使用哪种语言,几乎可以肯定已经有了 CSV 解析器 - 您是否检查过它是否已经能够处理格式错误的输入? (从而避免您重新发明轮子)
  • 我没有使用任何编程语言,它是一个过程的一部分,它基本上每天都会自动处理一堆文件以进行批处理。客户端使用名为 winautomation 的自动化程序,该程序基本上具有内置的替换文本操作,该操作在查找/替换参数中接受 .NET 风格的正则表达式。
  • 好的,所有这些都应该是问题的一部分——尤其是“.NET 风味正则表达式”部分。

标签: regex programming-languages csv expression


【解决方案1】:
(?<!^|,)"(?!,|$)

将匹配一个双引号,该双引号前后没有逗号,也没有位于行首/行尾。

如果您需要在逗号周围或在行首/行尾允许空格,并且如果您的正则表达式风格(您没有指定)允许任意长度的向后查找(例如,.NET 允许),您可以用

(?<!^\s*|,\s*)"(?!\s*,|\s*$)

【讨论】:

  • 哇,非常感谢,蒂姆。这是.NET 风格。我目前正在一个名为 winautomation 的自动化程序中使用文本查找/替换功能。但是,在查找和替换中同时使用正则表达式会返回每行的第一个双引号和最后一个双引号的替换。它似乎确实在每个文本字段中找到并替换了未转义的双引号。所以以 "asdf","as "something" df","asdf" 为例,查找并替换为 ^,我得到 ^asdf","as ^something^ df","asdf^ 我该如何补救第一个和最后一个“?
  • 您需要设置选项以允许^$ 匹配行的开头和结尾(而不是整个输入)。在 .NET 中,该选项称为 RegexOptions.Multiline。我不知道您是否可以将该选项传递给 winautomation。
【解决方案2】:

我正在使用 VIM 删除 .CSV 文件中的嵌套引号,这对我有用:

"[^,"][^"]*"[^,]

【讨论】:

    【解决方案3】:

    在 vim 中,我使用它来删除所有未转义的引号。

    :%s/\v("(,")@!)&((",)@<!")&("(\n)@!)&(^@<!")//gc
    

    详细解释是,

    : - start the vim command
        % - scope of the command is the whole file
        s - search and replace
            / - start of search pattern
            \v - simple regex syntax (rather than vim style)
                (
                    " - double quote
                    (,") - comma_quote
                    @! - not followed by
                )
                & - and
                (
                    (",) - quote_comma
                    @<!- does not precedes
                    " - double quote
                )
                & - and
                (
                    " - double quote
                    (\n) - line end
                    @! - not followed by
                )
                & - and
                (
                    ^ - line beginning
                    @<! - does not precedes
                    " - double quote
                )
            / - end of search pattern and start of replace pattern
                 - replace with nothing (delete)
            / - end of replace pattern
        g - apply to all the matches
        c - confirm with user for every replacement
    

    这可以相当快地完成工作。唯一失败的情况是数据中有“,”模式的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多