CSVファイルから列を削除する

CSVファイルから列を削除する

列を削除する必要があるCSVファイルがあります。問題は、ヘッダーなしでCSVファイルをエクスポートすることです。それでは、CSVファイルからこの列をどのように削除できますか?たとえば、私が持っている場合例.csvブールデータである最後の列を削除し、ファイルを次のようにインポートしたいと思います。入力.csv

入力.csv

1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE

出力.csv

1,"data",100.00
2,"code",91.8
3,"analytics",100.00

答え1

4番目の列を削除するには

$ cut -d, -f4 --complement example.csv > input.csv

列番号と一致するように -f オプションを調整します。

CSVファイルがより複雑な場合は、PerlおよびText :: CSVパッケージを使用できます。

$ perl -MText::CSV -E '$csv = Text::CSV->new({binary=>1});
  while ($row = $csv->getline(STDIN))
  {
    "$row->[0],$row->[1],$row->[2]\n" を印刷します。
  } '<example.csv>入力.csv

答え2

使用することをお勧めしますミラー(別名mlr)。 Millerは、さまざまな形式(TSV、CSV、テーブル形式JSON、キーと値のペア)のテーブル形式データをストリーミングするためにC(依存関係なし)で書かれた小さな(1MB未満)プログラムです。これはほとんどのLinuxディストリビューションストアです(通常ミラー)。 CSVパーサーは、複数行のセル(つまり、改行を含むセル)を処理します。ヘッダー付きのCSVファイルを想定していますが、タイトルのないCSVファイルを処理するオプション(および)があります--implicit-csv-header--headerless-csv-outputユースケースで4番目の列(列インデックスは1で始まる)を削除すると仮定すると、次のようになります。

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv > output.csv

計算せずに最後の列を削除するには、次revのようにデータを処理する前に各CSV行を逆にしてから再度削除します。

< input.csv rev |
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 1 |
rev > output.csv

お役に立てば幸いです。

答え3

Pythonでcsvモジュールを使用する:

python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
    w.writerow(row[0:-1])' < input.csv > output.csv

出力に列2、3、1が順番に含まれるようにするには、次のようにします。

python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
    w.writerow([row[1], row[2], row[0]])' < input.csv > output.csv

Python配列のインデックスは0から始まるので、上記のように列番号も0から計算され始めます。これが、列2、3、1がそれぞれ1、2、0である理由です。

答え4

CSV形式は時々難しいです。 CSVパーサーが最善の選択です。

簡単な方法を選択して最後のフィールドを削除してください。

1) awk で最後のフィールドを削除します。

awk 'BEGIN{FS=OFS=","}{NF--;print}'

2)正規表現とパール

perl -pe 's/.*\K,.*//'

関連情報