[英]Remove carriage returns from CSV data value
我正在使用 LOAD DATA INFILE 语句将数据从管道分隔的 CSV 导入 MySQL。 我正在使用 '\\r\\n' 终止行。 我的问题是每行中的一些数据中有 '\\r\\n' ,导致加载错误。 我有类似的文件,它们只在数据中使用 '\\n' 来指示换行符,这不会导致任何问题。
示例 GOOD CSV
School|City|State|Country\r
Harvard University|Cambridge|MA|USA\r
Princeton University|Princeton|New
Jersey
|USA\r
示例 BAD CSV
School|City|State|Country\r
Harvard University|Cambridge|MA|USA\r
Princeton University|Princeton|New\r
Jersey\r
|USA\r
有没有办法使用 sed、awk 或 perl 预处理 CSV 以清除列值中的额外回车符?
这是 perl 中的一种可能的解决方案。 它在一行中读取,如果少于 4 个字段,它会在下一行继续读取并合并它,直到它确实有 4 个字段。 只需将$number_of_fields
的值更改为正确的数字。
#!/usr/bin/perl
use strict;
use warnings;
my $number_of_fields=4;
while(<STDIN>)
{
s/[\r\n]//g;
my @fields=split(/\|/);
next if($#fields==-1);
while($#fields<$number_of_fields-1)
{
my $nextline=<STDIN> || last;
$nextline =~ s/[\r\n]//g;
my @tmpfields=split(/\|/,$nextline);
next if($#tmpfields==-1);
$fields[$#fields] .= "\n".$tmpfields[0];
shift @tmpfields;
push @fields,@tmpfields;
}
print join("|",@fields),"\r\n";
}
使用用于多字符 RS 和 RT 的 GNU awk:
$ awk -v RS='([^|]+[|]){3}[^|]+\r\n' -v ORS= '{$0=RT; gsub(/\r/,""); sub(/\n$/,"\r\n")} 1' file | cat -v
School|City|State|Country^M
Harvard University|Cambridge|MA|USA^M
Princeton University|Princeton|New
Jersey
|USA^M
请注意,它假定字段数为 4,因此如果您有其他一些字段数,则将3
更改为该数字减去 1。如果第一行不能,脚本可以通过读取输入的第一行来计算字段数有你的问题:
$ awk '
BEGIN { RS="\r\n"; ORS=""; FS="|" }
FNR==1 { RS="([^|]+[|]){"NF-1"}[^|]+\r\n"; RT=$0 RT }
{ $0=RT; gsub(/\r/,""); sub(/\n$/,"\r\n"); print }
' file | cat -v
School|City|State|Country^M
Harvard University|Cambridge|MA|USA^M
Princeton University|Princeton|New
Jersey
|USA^M
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.