Entfernen von doppelten Anführungszeichen und Ersetzen durch Kommas darin

Entfernen von doppelten Anführungszeichen und Ersetzen durch Kommas darin

Ich suche nach einem Befehl, mit dem ein/zwei Anführungszeichen aus einer Datei im CSV-Format entfernt und die darin enthaltenen Kommas durch Leerzeichen ersetzt werden können, sodass das gesamte Feld wie ein einziges aussieht.

Bsp.: soll in der CSV-Datei ""Wembley,London""als unter einer Spalte angezeigt werden .Wembley London

Außerdem wird der Befehl für „Wembley, London“ als Wembley London ausgegeben. Unabhängig von der Feldposition würde das Skript die Datei lesen.

Ich habe die folgenden Befehle ausprobiert, aber sie sind nicht hilfreich.

sed 's/\"//g' $fname >  $Target/sample_UPS1.csv
sed 's/\,/ /g' $Target/sample_UPS1.csv >  $Target/sample_UPS1.csv

awk -F'""' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $fname | sed 's/\"//g'   > $Target/sample_UPS.txt ##For removal of two double quotes and substitution of comma with a space##

awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $Target/sample_UPS.txt | sed 's/\"//g' > $Target/sample_UPS1.txt ##For removal of double quotes and substitution of comma with a space##

In beiden Fällen ist sample_ups1 meine Ausgabedatei.

Antwort1

Wenn Sie eine gültige CSV-Datei haben, sollten Sie einen geeigneten CSV-Parser verwenden. Ruby ist einfach zu verwenden: Wenn

cat file.csv
"""Wembley,London""",a,"b","c, ""d e"", ""f,g"",h"

Dann

ruby -e '
    require "csv"
    data = CSV.read ARGV.shift
    data.each {|row| 
        row.each {|field| field.delete! "\""; field.tr! ",", " "}
        puts CSV.generate_line row
    }
' file.csv
Wembley London,a,b,c  d e  f g h

Beachten Sie, dass eingebettete Anführungszeichen in einem CSV-Felderfordern die Verdoppelung der Anführungszeichen. Wenn Sie haben

""Wembley,London"","other stuff",...

dann liegt ein fehlerhaftes CSV vor.

Antwort2

PerlsText::CSVDas Modul kann fehlerhafte CSVs dieses Typs verarbeiten:

Bei wirklich schlechten CSV-Daten, wie

1,"foo "bar" baz",42

oder

1,""foo bar baz"",42

Es gibt eine Möglichkeit, diese Datenzeile zu analysieren und die Anführungszeichen im zitierten Feld unverändert zu lassen. Dies kann erreicht werden, indem man festlegt allow_loose_quotesund sicherstellt, dass das escape_charnicht gleich ist mitquote_char

So zum Beispiel

echo 'a,b,c,1234,23,""Wembley,London"",267,agty' | 
  perl -MText::CSV -lne '
    BEGIN{$p = Text::CSV->new( {allow_loose_quotes => 1, escape_char => "\\"} )} 
    print join ",", map { s/,/ /g; s/"//g; $_ } $p->fields() if $p->parse($_)
'
a,b,c,1234,23,Wembley London,267,agty

verwandte Informationen