我有一个文件正在提供给Informatica Developer。我知道文件格式不正确,但我不能更改它。
此文件是一个标准的CSV文件,使用分号作为分隔符。字段不在引号之间。它使用CRLF行尾字符。
问题来自于这样一个事实,即少数字段包含LF字符。
当我使用LF作为行分隔符时,包含LF字符的字段会中断并且不会正确导入。
我尝试过使用CR作为行分隔符,但这意味着每行的第一个字段(除了第一个字段(都包含";\n〃;。目前,我正在删除第一个字段的第一个字符,以去掉";\n〃;,但这意味着第一行第一个字段的第一个字符被删除,即使它是合法字符。我一直找不到合适的正则表达式来将该行与其他行分开。
有没有我看不到的解决方案?
根据您的解释:
- 行终止于CRLF序列
- 字段可以是带有LF行终止符的多行
- 听起来那些LF是这些字段的一部分,因此必须保留
如果您有PERL,您可以通过以下方式处理行:
- 设置CRLFs为行终止符也称为record separator
- 用双引号将值括起来
"
行执行此任务。
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"