2017-10-06 65 views
0

我使用LOAD DATA INFILE語句將數據從管道分隔的CSV導入到MySQL。我正在使用'\ r \ n'來終止行。我的問題是,每行內的一些數據中有'\ r \ n',導致加載錯誤。我有類似的文件,只是在數據中使用'\ n'來指示換行符,並且不會引起任何問題。從CSV數據值中刪除回車符

例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 

有沒有辦法預先處理的CSV,使用SED,AWK或Perl,清理額外的回車在列值?

+0

是Ed,不幸的。這是我得到的格式,我沒有能力改變它。 – Gavi

+0

行是否有固定數量的字段? –

+0

@ChrisTurner是有固定數量的字段 – Gavi

回答

0

隨着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 
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"; 
    }