sed를 사용하여 CSV 파일에서 큰따옴표 안에 있는 경우 쉼표를 바꿉니다.

sed를 사용하여 CSV 파일에서 큰따옴표 안에 있는 경우 쉼표를 바꿉니다.

MySQL 테이블에 로드해야 하는 CSV 파일이 있습니다. 나는 ,문자로 끝나는 열을 식별하는 데 의존합니다. 그렇기 때문에 ,열 구분 기호를 제외하고는 다른 곳에 표시되지 않는 것이 중요합니다.

,일부 행에는 내부에 큰따옴표가 있는 열이 포함되어 있는 것으로 나타났습니다. 예를 들어 다음과 같은 줄이 있습니다.

12,"name, brand - something, something",age,sex,,,,"name, brand - something, something, something",,,,,

다음으로 변환해야 합니다.

12,name; brand - something; something,age,sex,,,,name; brand - something; something; something,,,,,

보시다시피, MySQL에서 파일을 로드할 때 ,내부 큰따옴표가 더 이상 구분 기호로 간주되지 않도록 내부 큰따옴표를 대체했습니다 . 큰따옴표도 필요하지 않으므로 제거했습니다.;,,"

다음과 같이 CSV 파일의 각 줄에 대해 이 작업을 자동으로 수행하기 위해 sed를 사용하려고 합니다.

sed -e 's/"\*,\*"/"\*;\*"/g' -e 's/"//g' input.csv > output.csv

그러나 결과는 ,큰따옴표 안의 내용을 대체 하지 않습니다 ;. 큰따옴표만 제거합니다.

12,name, brand - something, something,age,sex,,,,name, brand - something, something, something,,,,,

답변1

csv 파일은 까다로울 수 있습니다. 줄 어딘가에 이스케이프된 따옴표가 있을 수 있으며, 처리 중인 정규식은 읽을 수 없고 오류가 발생하기 쉽습니다.

다음과 같은 도구를 사용하는 것이 좋습니다.이력서 툴킷또는 Perl이나 Python의 작은 스크립트입니다. Python으로 작성된 이 빠른 프로그램은 트릭을 수행해야 합니다.

import csv

with open('input.csv',mode='r') as csv_file:
   csv_reader = csv.reader(csv_file)
   for row in csv_reader:
       print (',').join([f.replace(',',';') for f in row])

답변2

@steeldriver가 이미 언급했듯이 mysql사용 여부를 알 수 있습니다.올바른 선택, 하지만 FWIW에서는 awk를 사용하여 이 작업을 수행할 수 있습니다.

awk -v RS='"' -v ORS= 'NR % 2 || gsub(/,/,";") || 1'

12,name; brand - something; something,age,sex,,,,name; brand - something; something; something,,,,,

또는 함께 제공되는 인용문을 유지하면서 다음을 수행합니다.

awk -v RS='"' -v ORS= '{if(NR % 2) print; else{gsub(/,/,";");print RS $0 RS}}'

12,"name; brand - something; something",age,sex,,,,"name; brand - something; something; something",,,,,

이것은 다음과 같은 트릭을 사용합니다.여기, 복원만 가능: 부품을 수정하지 않음외부인용문, 일부 수정 중입니다~에인용 부호.

답변3

내가 찾은 가장 좋은 대답은 다음 줄을 추가하여 MySQL 자체를 사용하는 것입니다.

OPTIONALLY ENCLOSED BY '"'

예를 들어 로드 쿼리는 다음과 같습니다.

LOAD DATA INFILE 'filename.csv' INTO TABLE table_name 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"'
  IGNORE 1 LINES;

관련 정보