Bash: tsv zu csv konvertieren

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.225
Hallo zusammen,

die IMBD stellt ja paar Datenbankauszüge als TSV (Tabbed-Seperated) zur verfügung. Irgendwie ist mir CSV lieber (bekomme ich besser in mySQL importiert) zudem hab ich ein Problem mit den dortigen Zeilensprungverfahren...

Aktuell nutze ich unter Win zum Konvertieren notepad++:
1) Suchmodus "Erweitert": Zeilensprung ändern (\n zu \r\n )
2) Suchmodus "Normal" Copy&Paste eines "tabs" und durch ; ersetzen

Jetzt geht es um einen Datensatz der flockige 1 Mio-Datensätze hat (einer der kleineren IMDB...). #1 macht 1 Mio auführungen werden und #2 sogar 2 Mio (2 Tabs je Zeile die durch ; ersetzt werden müssen). Mein 2700x braucht hier leider doch verhältnismässig lang ... und ich hab durchaus noch interesse an den wirklich großen Datensätzen der IMDB...

Jetzt nutze ich unter Windows WSL und somit die möglichkeit ein Bash-Script zu schreiben was für mich konvertiert. Google ist mein Freund - aber in dem Fall ist Google eher der Freund von mehreren Seiten "TSV-to-CSV"-Webconverter :(

Komme da leider nicht so wirklich weiter, da mir bisher jeglicher Ansatz fehlt. Grundsätzlich etwas erfahrung in Bash hab ich schon (ich liebe WSL - macht Windows so viel einfacher) - aber das bezieht sich vorwiegend darum im Grafik/PDF/ZIP-Bereich Dateiheader auszulesen/manipulieren, Bestimmte Aktionen in Schleifen ausführen etc. Aber bisher ist das Thema: Dateiinhalt ("Plaintext") zu ändern noch völlig fremd. Stehe aber immer wieder vor der Frage wie ich da etwas verarbeite.

Danke schon mal für Anregungen ;)

PS: das TSV direkt über phpMyAdmin in die mySQL einzulesen wäre zwar auch nett ... aber wo bleibt der Bash-Lerneffekt? ;).
 
Wulfman_SG schrieb:
Aktuell nutze ich unter Win zum Konvertieren notepad++:
1) Suchmodus "Erweitert": Zeilensprung ändern (\n zu \r\n )
2) Suchmodus "Normal" Copy&Paste eines "tabs" und durch ; ersetzen
Du kannst dabei auch im "erweiterten Modus" bleiben und "\t" durch ";" ersetzen. Bei der IMDB kommt das vielleicht nicht vor, aber ansonsten können ";" natürlich auch im Text vorkommen, wodurch du danach plötzlich mehr Spalten in dieser Zeile hast.

Ansonsten wurde hier ja schon Hilfe gegeben.
 
Ein bißchen spät...
In MySQL/MariaDB kann man .tsv direkt importieren:
Code:
load data local infile 'PfadZu/title.basics.tsv'
into table Datenbank.Tabelle
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(tconst,titleType,primaryTitle,originalTitle,isAdult,startYear,endYear,runtimeMinutes,genres);
 
  • Gefällt mir
Reaktionen: lokon
Die Lösung von @GentooFuchs ist vermutlich besser als ein einfaches sed wie

NOX-X-X schrieb:

Grund: Die Feldinhalte - zB Filmtitel - enthalten Kommas - und auch Semikolons - ein | ist zB noch nicht verwendet.

Bei TSV, CSV und verwandten Formaten sollten die Trennzeichen NICHT Bestandteil der Felder sein - oder leicht unterscheidbar.
Beim Weiterverwenden mit awk kann ein Feldseparator angegeben werden - da funktioniert auch soetwas wie -F "#--#"

Die Datenbank kann dann auch mit diesen Feldseparatoren exportiert werden - in mysql/mariadb zB ... INTO OUTFILE .... FIELDS TERMINATED BY '#--#'
 
  • Gefällt mir
Reaktionen: WulfmanGER und NOX-X-X
Zurück
Oben