큰따옴표로 묶인 쉼표로 구분된 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 -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를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까.