
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_quotes
und sicherstellt, dass dasescape_char
nicht 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