CSV 파일에서 열 제거

CSV 파일에서 열 제거

열을 삭제해야 하는 CSV 파일이 있습니다. 문제는 헤더 없이 CSV 파일을 내보낸다는 것입니다. 그렇다면 CSV 파일에서 이 열을 어떻게 제거할 수 있습니까? 예를 들어, 내가 가지고 있는 경우예제.csv부울 데이터인 마지막 열을 제거하고 파일을 다음과 같이 가져오고 싶습니다.입력.csv.

입력.csv

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

출력.csv

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

답변1

네 번째 열을 삭제하려면

$ 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))
  {
    "$row->[0],$row->[1],$row->[2]\n"을 인쇄합니다.
  }' <example.csv> 입력.csv

답변2

나는 사용하는 것이 좋습니다밀러(일명 mlr). Miller는 다양한 형식(예: TSV, CSV, 테이블 형식 JSON, 키-값 쌍)의 표 형식 데이터를 스트리밍하기 위해 C(종속성 없음)로 작성된 작은(1MB 미만) 프로그램입니다. 이는 대부분의 Linux 배포판 저장소(일반적으로밀러). CSV 파서는 여러 줄의 셀(즉, 줄 바꿈이 포함된 셀)을 처리합니다. 헤더가 있는 CSV 파일을 가정하지만 제목 없는 CSV 파일을 처리할 수 있는 옵션(및)이 있습니다 --implicit-csv-header. --headerless-csv-output사용 사례에서 네 번째 열(열 인덱스는 1로 시작)을 삭제한다고 가정하면 다음과 같이 할 수 있습니다.

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv > output.csv

계산하지 않고 마지막 열을 제거하려면 다음 rev과 같이 데이터를 처리하기 전에 각 CSV 행을 반대로 한 다음 다시 제거하면 됩니다.

< input.csv rev |
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 1 |
rev > output.csv

도움이 되길 바랍니다.

답변3

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인 이유입니다.

답변4

CSV 형식은 때때로 까다롭습니다. CSV 파서가 최선의 선택입니다.

쉬운 방법을 택하고 마지막 필드를 삭제하세요.

1) awk로 마지막 필드를 삭제합니다.

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

2) 정규식과 펄

perl -pe 's/.*\K,.*//'

관련 정보