
固定サイズではない配列を削除したい。例えば
file.csv
001,"Geography",TRUE,"{1,0,1,1}",1,"CHARLIE"
002,"History",FALSE,"{0,0,1,1}",0,"DAVID"
003,"Mathematics",TRUE,"{1,1,1,1}",1,"SAM"
次の配列は以下の形式に変換する必要があります
file_edited.csv
001,"Geography",TRUE,1,"CHARLIE"
002,"History",FALSE,0,"DAVID"
003,"Mathematics",TRUE,1,"SAM"
コマンドラインでこれを行う方法。
答え1
これを実現するにはさまざまな方法があると思いますが、私は次の方法を好みますsed
:
sed 's/"{.*}",//'
の上GNU/Linux(GNU sed
) では、以下を使用します。
sed 's/"{.*}",//' csv
001,"Geography",TRUE,1,"CHARLIE"
002,"History",FALSE,0,"DAVID"
003,"Mathematics",TRUE,1,"SAM"
OS X(BSD sed
、-E
フラグに注意してください):
sed -E 's/"{.*}",//' csv
001,"Geography",TRUE,1,"CHARLIE"
002,"History",FALSE,0,"DAVID"
003,"Mathematics",TRUE,1,"SAM"
答え2
Python とその CSV モジュールを使用します。たとえば、次の単一コマンドを使用します。
python -c 'import sys,csv
w = csv.writer(sys.stdout, quoting=csv.QUOTE_NONNUMERIC)
for row in csv.reader(sys.stdin):
del row[3]
w.writerow(row)' < file.csv > file_edited.csv
魔法はコマンドの最後から 2 番目の行で起こります。Python では、配列はインデックス 0 から始まり、row[3]
4 番目の列も同様です。したがって、これは各レコードの 4 番目の列を削除するだけです。
あるいは、次のようにして列0、1、2、4、5を印刷することもできます。
python -c 'import sys,csv
w = csv.writer(sys.stdout, quoting=csv.QUOTE_NONNUMERIC)
for row in csv.reader(sys.stdin):
w.writerow([row[0], row[1], row[2], row[4], row[5]])' < file.csv > file_edited.csv