【问题标题】:Remove carriage returns from CSV data value从 CSV 数据值中删除回车符
【发布时间】:2018-03-18 09:03:46
【问题描述】:

我正在使用 LOAD DATA INFILE 语句将数据从管道分隔的 CSV 导入 MySQL。我正在使用 '\r\n' 来终止行。我的问题是每行中的一些数据中有'\r\n',导致加载出错。我有类似的文件,只是在数据中使用 '\n' 来表示换行符,这不会导致任何问题。

良好的 CSV 示例

School|City|State|Country\r
Harvard University|Cambridge|MA|USA\r
Princeton University|Princeton|New
Jersey
|USA\r

错误的 CSV 示例

School|City|State|Country\r
Harvard University|Cambridge|MA|USA\r
Princeton University|Princeton|New\r
Jersey\r
|USA\r

有没有办法预处理 CSV,使用 sed、awk 或 perl,以清除列值中的额外回车?

【问题讨论】:

  • 是的,Ed,很遗憾。这是给我的格式,我没有能力改变它。
  • 行有固定数量的字段吗?
  • @ChrisTurner 是的,有固定数量的字段
  • @EdMorton 是的,我可以确定哪个字段通常具有多行数据。
  • 抱歉,Ed,我没有意识到您已经编辑了我原来的问题。已恢复。

标签: linux perl awk sed text-processing


【解决方案1】:

这是 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";
    }

【讨论】:

    【解决方案2】:

    使用 GNU awk 进行多字符 RS 和 RT:

    $ 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2016-09-06
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2018-06-14
      • 2014-05-20
      • 2020-09-15
      相关资源
      最近更新 更多