2017-10-06 4 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を使用して、余分な改行をクリーンアップするがあります列の値に? GNUマルチchar型のRSのためのawkとRTで

+0

はい、残念ながら、Ed。これは私が与えた形式であり、私はそれを変更する能力がありません。 – Gavi

+0

行には固定数のフィールドがありますか? –

+0

@ChrisTurnerはい固定数のフィールドがある – Gavi

答えて

0

$ 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"; 
    } 
関連する問題