为 Informatica Developer 处理带有 CRLF 记录终止符的 CSV 文件和带有 LF 终止符的不带引号的多行字段

Handling CSV file with CRLF record terminators and unquoted multiline fields with LF terminators for Informatica Developer

我有一个文件要提供给 Informatica Developer。我知道文件格式不正确,但我不能更改它。

此文件是标准 CSV 文件,使用分号作为分隔符。这些字段不在引号之间。它使用 CRLF 行尾字符。

问题出在一些字段包含 LF 字符。

当我使用 LF 作为行分隔符时,包含 LF 字符的字段会中断并且无法正确导入。

我试过使用 CR 作为行分隔符,但这意味着每行的第一个字段(除了第一行)包含“\n”。目前我正在删除第一个字段的第一个字符以删除“\n”,但这意味着第一行第一个字段的第一个字符被删除,即使它是一个合法字符。我一直无法找到正确的正则表达式来将该行与其他行分开。

是否有我没有看到的解决方案?

根据您的解释:

  • 行以 CRLF 序列终止
  • 字段可以是多行的,带有 LF 行终止符
  • 听起来那些 LF 是这些字段的一部分,因此 必须保留

如果您有 PERL,您可以通过以下方式处理这些行:

  1. 设置CRLFs作为行终止符也称为记录分隔符
  2. 用双引号将值括起来 "

该行执行此任务。

perl -lpe  'BEGIN {$/ = "\r\n"} s/([^;]+)/""/g' < records.csv

一些解释:

  • -l: 在处理记录行之前“chomps”(删除)记录分隔符
  • -p:迭代处理过的行并打印结果(参见 man perlrun)
  • -e: 执行给定的脚本来处理每个读取的行
  • 关于脚本
    • BEGIN {$/ = "\r\n"} 是在开始时执行的特殊块,所以在迭代之前;它告诉行尾是 CRLF (\r\n)
    • s/([^;]+)/""/g 告诉用双引号将每个字段(没有分号的序列)括起来;此脚本由 -p
    • 迭代

那么您的 CSV 数据就会受到保护,可以随时提供了。

示例:

  • 输入(特殊字符表示):

     barf;berf\nbirf;borf\r\n
     parf;perf\npirf;porf\r\n
    
  • 结果:

     "barf";"berf
     birf";"borf"
     "parf";"perf
     pirf";"porf"