需要正则表达式帮助清理分隔数据

时间:2016-06-13 20:46:09

标签: regex csv text rfc4180

我有一些管道分隔的数据,如下所示:

    field|field|field|field|another "field"|field
    field|field|field|"another" field|field|field
    field|"fie|ld"|field|field|field|field

我遇到的问题是双引号没有为分隔字段正确形成(包含分隔符或引号的字段本身应该用双引号括起来,并且双引号应该用另一个双引号进行说明。这就是输出应该是:

    field|field|field|field|"another ""field"""|field
    field|field|field|"""another"" field"|field|field
    field|"fie|ld"|field|field|field|field

任何人都知道使用正则表达式是否有一种简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

只有部分操作适用于正则表达式。其他部分更适合常规程序流程。正则表达式仍然是操作的一个组成部分,但尽可能使用内置的字符串操作。

使用PCRE:

  1. 读入输入字符串的一行。
  2. 将任意匹配的行拆分为"[^"]*"(*SKIP)(*F)|\|以获取字段列表。
  3. 对于每个字段:
    1. 如果它包含与(?<!^)"(?!$)的匹配项,请在引号中包围该字段。
    2. 之后,将所有匹配项替换为(?<!^)"(?!$) ""
  4. 重新加入字段列表并将其作为新CSV的一行输出。
  5. 返回步骤#1,直到所有线路都已处理完毕。
  6. Regex #1 Test
    Regex #2 Test (Stage 1)
    Regex #2 Test (Stage 2)

    My attempt at translating this to PERL