繁体   English   中英

从 CSV 数据值中删除回车

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM