CSV 파일의 구분 기호 변경

CSV 파일의 구분 기호 변경

CSV 형식의 입력 파일이 있습니다. 일부 필드는 쉼표와 함께 큰따옴표로 묶여 있습니다. 샘플라인입니다

123,"ABC, DEV 23",345,534.202,NAME

a 의 큰따옴표 안에 표시되지 않는 모든 쉼표를 제거해야 하므로 ~출력은 다음과 같아야 합니다.

123~"ABC, DEV 23"~345~534.202~NAME

나는 이것을 시도했지만 나에게 반대 결과를 제공합니다.

awk -F '"' -v OFS='' '{ for (i=0; i<= NF; ++i) gsub(",","~",$i) } 1' test.txt
123,ABC~ DEV 23,345,534.202,NAME

답변1

,기본적으로 구분 기호를 에서 으로 바꾸려는 CSV 파일이 있습니다 ~.

사용csvkit:

$ csvformat -D '~' file.csv >newfile.csv

$ cat newfile.csv
123~ABC, DEV 23~345~534.202~NAME

cvsformat불필요한 따옴표를 제거하십시오. 도착하다다음에 추가인용 부호:

$ csvformat -U 1 -D '~' file.csv
"123"~"ABC, DEV 23"~"345"~"534.202"~"NAME"

이용정보를 확인하세요 csvformat --help.


사용밀러( mlr) 대신에:

$ mlr --csv -N --ofs '~' cat file.csv
123~ABC, DEV 23~345~534.202~NAME

더 이상 필요하지 않더라도 원래 인용문을 유지하십시오.

$ mlr --csv -N --ofs '~' --quote-original cat file.csv
123~"ABC, DEV 23"~345~534.202~NAME

두 명령 모두에서 이 -N옵션은 입력에 헤더가 없고 출력에도 헤더가 없어야 한다는 사실을 나타내는 데 사용됩니다. 이 --ofs옵션은 출력 필드 구분 기호를 설정합니다.

답변2

암소 비슷한 일종의 영양awk해결책:

awk -v FPAT='[^,]+|"[^"]+"' '{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF? "~" : ORS) }' file
  • FPAT='[^,]+|"[^"]+"'- 각 필드를 설명하는 정규식 패턴은 다음과 같습니다."쉼표가 아닌 모든 것"또는"큰 따옴표, 큰 따옴표가 아닌 모든 것 및 닫는 큰 따옴표."

산출:

123~"ABC, DEV 23"~345~534.202~NAME

답변3

이것을 시도해 볼 수 있습니다.

awk 'NR%2==1{gsub(",","~")}1' RS='"' ORS='"' infile

답변4

위의 예에서는 다음 두 가지 방법으로 수행했습니다. 테스트됨

방법 1

for (( i=1;i<6;i++)); do awk -F "," -v i="$i" '$i ~ /"/{gsub(" ",",",$2);print }' inputfile;done| tail -1| sed 's/,/~/3g'| sed 's/,/~/1'

산출

123~"ABC, DEV 23"~345~534.202~NAME'

방법 2

 sed "s/,/~/3g" inputfile| sed 's/,/~/1'

산출

123~"ABC, DEV 23"~345~534.202~NAME'

관련 정보