csvファイルの解析、区切り文字の置換、""の間のフィールドの内容を無視する

csvファイルの解析、区切り文字の置換、""の間のフィールドの内容を無視する

区切り記号付きのファイルがあります;。私のアプリケーションは、これらの区切り文字に基づいてデータを解析します。文字列フィールドは列間""と列内にあり、テキストで区切り文字を使用できます。そのファイルの区切り文字を変更したい(例:に変更|""。例は次のとおりです。

入力する:

"BARCELONA";"";"Country.666;53;98";15;19;"test";4343;63647;655848

出力

"BARCELONA"|""|"Country.666;53;98"|15|19|"test"|4343|63647|655848

答え1

正確な出力を得るには、

$ perl -MText::CSV -lpe '
    BEGIN{$p = Text::CSV->new({sep_char => ";"})} 
    $_ = join "|", map { /^\d+$/ ? $_ : qq("$_") } $p->fields() if $p->parse($_)
  ' INPUT
"BARCELONA"|""|"Country.666;53;98"|15|19|"test"|4343|63647|655848

枠にとらわれない言及にこだわらないと、

$ csvformat -d';' -D'|' INPUT
BARCELONA||Country.666;53;98|15|19|test|4343|63647|655848

数値以外の値を参照するように入力と出力を強制します。ほぼ必要な方法で動作しますが、明らかに数値フィールドを浮動小数点に昇格します。

$ csvformat -d';' -u2 -D'|' -U2 INPUT
"BARCELONA"|""|"Country.666;53;98"|15.0|19.0|"test"|4343.0|63647.0|655848.0

答え2

現場でデータを変更することは安全ではありません。

csvファイルを解析するには、次のものを使用できます。csvtool

$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1- -
BARCELONA,,Country.666;53,15

または特定の地域をターゲティング

$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1,3 -
BARCELONA,Country.666;53    

答え3

こうすれば簡単だろうと思いましたawkが、結局ちょっと混乱しました。ただし、この問題で問題が発生しているため、awkその機能を活用するFPAT潜在的なソリューションは次のとおりです。

cat file.txt | awk -v FPAT='[^;]+|"[^"]+"' '{ for( col=1; col<=NF; col++ ) { printf "%s|", $col; } print "" }'

FPATデフォルトでは、正規表現を使用して項目として分類される項目を定義し(セミコロンや引用符なし)、|列の間に()文字を使用して再印刷します。もともと私はそのOFSオプションを使用しようとしましたがうまくいきFPATません。

答え4

GNU sed拡張正規表現が有効なエディタを使用してこれを実行できます。

$ sed -Ee 's/(("[^"]*")+|[^;]+);/\1|/g' in.csv

関連情報