Entfernen Sie doppelte Anführungszeichen in einer CSV-Datei, die durch Kommas getrennt und in doppelte Anführungszeichen eingeschlossen ist.

Entfernen Sie doppelte Anführungszeichen in einer CSV-Datei, die durch Kommas getrennt und in doppelte Anführungszeichen eingeschlossen ist.

Vielleicht habe ich Pech, weil meine in Anführungszeichen und durch Kommas getrennte CSV-Datei im Nutztext doppelte Anführungszeichen und Kommas enthält.

Also möchte ich Folgendes ändern:

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

auf diesem:

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

Beachten Sie, dass ich die doppelten Anführungszeichen aus name ""2""„to“ entfernt habe name 2, die doppelten Anführungszeichen aus Zeile 3 jedoch beibehalten habe:,""

Antwort1

Verwenden Sie csvformat, um die Trennzeichen in Tabulatoren ( csvformat -T) umzuwandeln, alle doppelten Anführungszeichen ( tr -d '"') zu entfernen und die Trennzeichen dann durch Kommas zurückzusetzen, wobei jedes Feld in Anführungszeichen gesetzt wird (das letzte Stück der 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",""

csvformatist ein Teil voncsvkit.

Antwort2

Dies funktioniert unabhängig davon, welche Zeichen Ihre Eingabe enthält (außer Zeilenumbrüchen innerhalb von Feldern mit Anführungszeichen, aber das ist ein ganz anderes Problem).

Mit GNU awk für 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",""

oder das Äquivalent mit jedem 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",""

Siehe auchWas ist der robusteste Weg, CSV mithilfe von AWK effizient zu analysieren?.

verwandte Informationen