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 23행에서는 큰따옴표를 유지했습니다.,""

답변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 -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",""

당신은 또한 볼 수 있습니다awk를 사용하여 csv를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까.

관련 정보