2009-09-08 10 views
13

私は300から500のレコードを持つcsvファイル(約250)を持っています。私は各ファイルから2または3列を切り取り、別のファイルに格納する必要があります。私はubuntu OSを使用しています。コマンドやユーティリティでそれを行う方法はありますか?csvの列を切り取る方法

答えて

22

フィールド内に列区切り文字がないことがわかっている場合は、cutを使用できます。

$ cat in.csv 
foo,bar,baz 
qux,quux,quuux 
$ cut -d, -f2,3 < in.csv 
bar,baz 
quux,quuux 

シェルbuildin 'for'を使用すると、すべての入力ファイルをループすることができます。

+2

「* .csv」を検索すると、すべてのファイルをスケーラブルに処理できます。 xargs cut -d、-f2,3> out.csv – pixelbeat

+2

コンマを取り除いたり、別のものに変更したい場合は、 'cut'の' --output-delimiter = STRING'オプションを使用することができます。 –

+14

この答えの主な問題は、 'cut'は区切り文字を含む引用符付きフィールドを処理しないということです。 CSVファイルにこのようなデータがある場合は、別のものを使用する必要があります。 –

9

フィールドに区切り文字が含まれている場合は、CSVファイルを解析できるライブラリを見つける必要があります。通常、汎用スクリプト言語には標準ライブラリにCSVモジュールが含まれます。あなたのフィールドはコンマまたは改行が含まれている場合は

Ruby: require 'csv' 
Python: import csv 
Perl: use Text::ParseWords; 
8

は、私はカット(や他のUNIXのテキスト処理ツール)が正常にデータを操作できるようにするために書いたヘルパープログラムを使用することができます。

https://github.com/dbro/csvquote

このプログラムは、引用符で囲まれたフィールド内の特殊文字を見つけ、一時的に切断されたプログラムを混同しないだろう印刷されない文字に置き換えます。その後、カットが完了した後に復元されます。

ルッツのソリューションは、なる:

csvquote in.csv | cut -d, -f2,3 | csvquote -u 
+0

はい、私にとってはうまくいきました。https://stackoverflow.com/questions/17199311/how-to-delete-a-column-columns-of-a-csv-file-which-has-cell-values-with -a-string/29134579#29134579 – nono

0

あなたはCSVを取得するためにssconvertを使用した場合は、試してみてください:

ssconvert -O 'separator="|"' "file.xls" "file.txt" 

お知らせTXT延長代わりCSV、この方法でしょうを使用してください。Gnumeric_stf:stf_assistant の代わりにエクスポータを使用してください。Gnumeric_stf:stf_csvを使用して、オプション(-Oパラメータ)を使用できます。さもなければ、が表示されます。ファイルセーバーはオプションエラーを受け取りません。パイプ文字ははるかに少ないですが、前にチェックしたいかもしれません。

その後、あなたはそれを名前を変更し、同じようなことを行うことができます。

cat file.csv | cut -d "|" -f3 | sort | uniq -c | sort -rn | head 
  • その他のオプションの例:-O 'eol=unix separator=; format=preserve charset=UTF-8 locale=en_US transliterate-mode=transliterate quoting-mode=never'
  • A solution with AWK v4+
  • ssconvert man page
関連する問題