web-dev-qa-db-ja.com

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

1つの列を削除する必要があるCSVファイルがあります。問題は、ヘッダーなしでCSVファイルをエクスポートしたことです。たとえば、CSVファイルから列を削除するにはどうすればよいですか。たとえば、example.csvブールデータである最後の列を削除し、ファイルをinput.csvにしたいとします。

input.csv

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

output.csv

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

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))
 {
 print "$ row-> [0]、$ row-> [1]、$ row -> [2]\n "
} '<example.csv> input.csv 
19
James

sed

_sed 's/,[^,]\+$//' file.csv
_
  • _,[^,]\+_は_,_に一致し、その後に_,_を除く任意の数の文字が続き、一致は空の文字列に置き換えられます

awk

_awk -F, '{for(i=1; i<NF; i++) printf("%s%s", $i, FS); print ""}' file.csv
_
  • _-F,_はフィールド区切り文字を_,_として設定します

  • for(i=1; i<NF; i++) printf("%s", $i); print ""最後のフィールドを除くフィールドを反復処理し、出力を目的の形式で出力します

例:

_% cat file.txt
1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE

% sed 's/,[^,]\+$//' file.txt                                     
1,"data",100.00
2,"code",91.8
3,"analytics",100.00

% awk -F, '{for(i=1; i<NF; i++) printf("%s%s", $i, FS); print ""}' file.txt
1,"data",100.00,
2,"code",91.8,
3,"analytics",100.00,
_
3
heemayl

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です。

3
Nominal Animal
cut -d "," -f 4 --complement input.csv > output.csv

ここでは、-dの後に区切り文字、つまり二重引用符で囲まれたセミコロン(;)が続き、-fの後に削除する列の番号が続きます。つまり、4。列番号は1から始まり、このコンテキストで続行されます。

1

CSV形式は扱いにくい場合があります。CSVパーサーを使用する方法です。

単純化したアプローチで、最後のフィールドを削除します。

1)Awkで最後のフィールドを削除する

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

2)Perlの正規表現

Perl -pe 's/.*\K,.*//'
1
JJoao

最後の文字の数を削除する非常に一般的なソリューション:

awk '{print substr($0, 1, length($0)-5)}' list1.txt
1,"data",100.00
2,"code",91.8
3,"analytics",100.00

-5は削除される文字の数です

0
user88036

このawkコマンドで列番号を変更するだけです。以下のコマンドは、3番目の列を削除します。 ($ 3)

awk -F, '{$3=""}1' OFS=, test.txt  | sed "s/^,//;s/,$//;s/,,/,/"
0
Kamaraj