쉼표로 구분되고 큰따옴표로 캡슐화된 CSV에서 간격 큰따옴표를 제거합니다.

쉼표로 구분되고 큰따옴표로 캡슐화된 CSV에서 간격 큰따옴표를 제거합니다.

큰따옴표로 묶인 쉼표로 구분된 CSV 파일에는 유용한 텍스트 내에 큰따옴표와 쉼표가 있기 때문에 운이 좋지 않았을 수도 있습니다.

그래서 나는 이것을 바꾸고 싶습니다 :

"record 1","name 1","text 1, text 2"
"record 2","name ""2""","text 2"
"record 3","name 3",""

그것에 대해 :

"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""

name ""2""to 에서 큰따옴표를 제거했지만 name 2라인 #3에서는 큰따옴표를 유지했습니다.,""

답변1

를 사용하여 csvformat구분 기호를 탭( csvformat -T)으로 바꾸고 큰따옴표( tr -d '"')를 제거한 다음 모든 필드(파이프라인의 마지막 비트)를 인용하면서 구분 기호를 쉼표로 반환합니다.

$ csvformat -T file.csv | tr -d '"' | csvformat -t -U1
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""

csvformat의 일부입니다csvkit.

답변2

이것은 입력에 어떤 문자가 있는지에 관계없이 작동합니다(인용 필드 내의 줄 바꿈은 제외하지만 이는 완전히 다른 문제입니다).

FPAT용 GNU awk 사용:

$ awk -v FPAT='("[^"]*")+' -v OFS='","' '{
    for ( i=1; i<=NF; i++ ) {
        gsub(/"/,"",$i)
    }
    print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""

또는 awk와 동등한 것:

$ awk -v OFS='","' '{
    orig=$0; $0=""; i=0;
    while ( match(orig,/("[^"]*")+/) ) {
        $(++i) = substr(orig,RSTART,RLENGTH)
        gsub(/"/,"",$i)
        orig = substr(orig,RSTART+RLENGTH)
    }
    print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""

또한보십시오csv를 사용하여 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까?.

관련 정보