配列列を切り取り、他の列をcsvファイルに結合する

配列列を切り取り、他の列をcsvファイルに結合する

CSVファイルがあります

input.csv

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

上記のCSVファイルから配列列を削除して出力を取得する必要があります。

output.csv

1,2,3,9,12
1,2,3,9,12
1,2,3,9,12

だから私は努力しました

cut -d , -f4 -- complement input.csv > output.csv

しかし、上記のコマンドはエラーを提供します

区切り文字は単一文字でなければなりません。

また、output.csvを他のCSVファイルと結合したいと思います。

column.csv
30
36
90

それから結果はこれです

result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

誰でも私を助けることができますか?

答え1


ミラー(http://johnkerl.org/miller/doc)から始める

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

とても簡単です。実行できます。

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv

得る

1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

cut -x -f 44番目の列を削除し、column.csvpaste列を追加しました。

答え2

引用符で囲まれた区切り文字を正しく処理するには、特別に設計されたCSVパーサー(perl Text :: CSVモジュールのパーサーなど)の使用を検討する必要があります。例えば、

paste -d, input.csv column.csv | perl -MText::CSV -ne '
  BEGIN {$csv = Text::CSV->new()}
  if ($csv->parse($_)) {
    @a = $csv->fields();
    splice(@a, 3, 1);
    print join(",", @a) . "\n";
  }'
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

答え3

@steeldriveが提案した特別に設計されたCSVパーサーを使用したくない場合は、次のものを使用できますawk

awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv

これは、例で提供されているスタイルでのみ機能します。

説明する:

テキストスペースの分割"

{split($0,a,"\"")

,2番目の列の最初の列を印刷して削除します。

print a[1] substr(a[3],2)

関連情報