Informatica Developer使用CRLF记录终止符处理CSV文件,使用LF终止符处理未引用的多行字段



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

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

问题来自于这样一个事实,即少数字段包含LF字符。

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

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

有没有我看不到的解决方案?

根据您的解释:

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

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

  1. 设置CRLFs行终止符也称为record separator
  2. 用双引号将值括起来"

行执行此任务。

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

一些解释:

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

然后您的CSV数据将受到保护,并准备好进行馈送。

示例:

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

    barf;berfnbirf;borfrn
    parf;perfnpirf;porfrn
    
  • 结果:

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

最新更新