列を削除する必要がある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,.*//'