Remova aspas duplas de intervalo em um CSV separado por vírgula e encapsulado por aspas duplas

Remova aspas duplas de intervalo em um CSV separado por vírgula e encapsulado por aspas duplas

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 csvformatpara 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.

informação relacionada