長さの異なる配列列の削除

長さの異なる配列列の削除

固定サイズのない配列を削除したいと思います。例えば

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"

オペレーティングシステム(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

関連情報