길이가 다른 배열 열 삭제

길이가 다른 배열 열 삭제

고정된 크기가 없는 배열을 삭제하고 싶습니다. 예를 들어

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/리눅스(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

마법은 명령의 두 번째 줄에서 마지막 줄까지 발생합니다. Python에서 배열은 인덱스 0에서 시작하고 row[3]네 번째 열도 마찬가지이므로 각 레코드의 네 번째 열만 제거됩니다.

또는 다음을 사용하여 열 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

관련 정보