Ich habe eine Reihe großer CSV-Dateien und möchte sie in TSV (tabulatorgetrenntes Format). Die Komplikation besteht darin, dass die Felder der CSV-Datei Kommas enthalten, z.
A,,C,"D,E,F","G",I,"K,L,M",Z
Erwartete Ausgabe:
A C D,E,F G I K,L,M Z
(wobei Leerzeichen dazwischen "harte" Tabulatoren sind)
Ich habe Perl, Python und Coreutils auf diesem Server installiert.
text-processing
python
perl
csv-simple
Dunkles Herz
quelle
quelle
Antworten:
Python
Fügen Sie der Datei mit dem Namen hinzu
csv2tab.sh
und machen Sie sie ausführbarTestläufe
quelle
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Beseitigt auch die Schleife.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Ich bezweifle,-m
dass das so funktioniert.Zum Spaß
sed
.Wenn Ihr
sed
nicht unterstützt-E
, versuchen Sie es mit-r
. Wenn Siesed
keinen\t
Literal-Tabulator unterstützen, versuchen Sie, einen Literal-Tabulator (in vielen Shells, ctrl- v tab) oder eine$'...'
C-Zeichenfolge (in diesem Fall muss der Backslash-In\2
verdoppelt werden) in Bash zu setzen . Wenn Sie die Anführungszeichen beibehalten möchten, verwenden Sie\1
stattdessen\2
(in diesem Fall ist das innere Klammerpaar unbrauchbar und kann entfernt werden).Dies unternimmt keinen Versuch, mit Anführungszeichen in Anführungszeichen umzugehen. Einige CSV-Dialekte unterstützen dies, indem sie das Anführungszeichen (sic) verdoppeln.
quelle
Mit dem
csvkit
Dienstprogramm (Python), zum Beispiel:Streaming mit korrektem CSV- und TSV-Anführungszeichen und Escapezeichen
Es ist in apt und anderen Paketmanagern
quelle
Eine Option könnte Perls Text :: CSV- Modul sein, z
demonstrieren
quelle
Perl
Awk
Ergebnis:
quelle
Für die Lösung mit thermonuklearer Fliegenklatsche muss libreoffice verwendet werden. Während https://ask.libreoffice.org/de/question/19042/ist-mglich-zu-konvertieren-der-getrennten-Wert-csv-zum-getrennten-Wert-tsv-über-kopflosen-Modus / schlägt vor, dass dies nicht möglich ist, aber es ist falsch (oder nur veraltet?) und der folgende Befehl funktioniert auf meinem 5.3 .:
loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv
Das
env
Argument könnte übersprungen werden, aber auf diese Weise werden die Dokumente in Ihrem letzten Dokument nicht angezeigt.quelle
Wenn Sie das
csvtool
Dienstprogramm haben oder installieren können :Beachten Sie, dass aus irgendeinem Grund
csvtool
keine Manpage vorhanden ist, sonderncsvtool --help
ein paar hundert Zeilen Dokumentation gedruckt werden.quelle
Die Verwendung
mlr
ist fast prägnant, aber das Deaktivieren von Headern erfordert lange Optionen:Ausgabe:
quelle
Ich habe einen Open-Source-Konverter von CSV zu TSV erstellt, der die beschriebenen Transformationen verarbeitet. Es ist recht schnell und kann einen Blick wert sein, wenn ständig große CSV-Dateien konvertiert werden müssen. Das Tool ist Teil des TSV-Toolkits von eBay (csv2tsv-Dokumentation hier ). Standardoptionen reichen für die beschriebene Eingabe aus:
quelle
Vim
Aus Spaß können Regex-Substitutionen in Vim durchgeführt werden . Hier ist eine mögliche vierzeilige Lösung, angepasst von: https://stackoverflow.com/questions/33332871/remove-all-commas-between-quotes-with-a-vim-regex
Anführungszeichen werden entfernt.
Um die Lösung etwas zu skripten, können die vier obigen Zeilen (ohne vorangestelltem Doppelpunkt) in einer Datei gespeichert werden, z
to_tsv.vim
. Öffnen Sie jede CSV zum Bearbeiten mit Vim undsource
demto_tsv.vim
Skript in der Vim- Befehlszeile (angepasst von https://stackoverflow.com/questions/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):quelle
Hier ist das Beispiel für die Konvertierung von CSV in TSV mit dem
jq
Dienstprogramm :oder:
Das CSV-Format muss jedoch gut formatiert sein, sodass jeder String in Anführungszeichen gesetzt werden muss.
Quelle: Einfaches TSV-Ausgabeformat .
quelle
Mit
perl
, vorausgesetzt, die CSV-Felder haben keine eingebetteten"
Zeilenumbrüche oder Tabulatoren:quelle
Das Folgende ist einfach eine Korrektur der Antwort von @tripleee, sodass alle Anführungszeichen aus dem letzten Feld entfernt werden, genau wie bei allen anderen Feldern.
Um zu zeigen, was korrigiert wird, finden Sie unten die Antwort eines Dreifachen sowie eine geringfügige Änderung der OP-Beispieldaten mit zusätzlichen Anführungszeichen um das letzte ' Z' -Feld.
Sie können sehen, dass ' Z ' in Anführungszeichen gesetzt ist. Dies unterscheidet sich vom Umgang mit den inneren Feldern. Zum Beispiel enthält das ' G ' keine Anführungszeichen.
Der folgende Befehl verwendet eine zweite Ersetzung, um die letzte Spalte zu bereinigen:
quelle
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
in diese Antwort eingegeben werden, wird die"Z,A"
falsch durchZ A
und nicht durch die richtige ersetztZ,A
.