Talvez eu esteja sem sorte, porque meu arquivo CSV separado por vírgulas entre aspas duplas tem aspas duplas e vírgulas em um texto útil.
Então eu quero transformar isso:
"record 1","name 1","text 1, text 2"
"record 2","name ""2""","text 2"
"record 3","name 3",""
naquilo:
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
Observe que removi as aspas duplas de name ""2""
to name 2
, mas mantive as aspas duplas da linha #3:,""
Responder1
Usando csvformat
para transformar os delimitadores em tabulações ( csvformat -T
), removendo quaisquer aspas duplas ( tr -d '"'
) e, em seguida, retornando os delimitadores para vírgulas enquanto cita cada campo (a última parte do pipeline):
$ 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
é parte decsvkit
.
Responder2
Isso funcionará independentemente de quais caracteres estão em sua entrada (exceto novas linhas nos campos entre aspas, mas isso é outro problema).
Com GNU awk para FPAT:
$ 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",""
ou o equivalente com qualquer 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",""
Veja tambémqual é a maneira mais robusta de analisar com eficiência o csv usando o awk.