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