Script zur Txt zu CSV Umwandlung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
gnude
Beiträge: 1567
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

Script zur Txt zu CSV Umwandlung

Beitrag von gnude » 22.08.2017 15:58:12

Hallo ich möchte gerne auf einem Linux Server aus Textdateien Werte extrahieren und in eine CSV zusammensetzten. Ich denke das ich da mit tools wie sed, grep oder awk weiter komme. Und suche jetzt Tipps wie ich das Thema angehe wo ich weiter lesen kann oder Snipets von Code.

Die Textdatei hat das Folgende Format:
vergrößern

Code: Alles auswählen

Start
Titel
Interpret
Lied 1  3:33
Lied 2  3:33
Lied 3  3:33
Ende
Start
Titel2
Interpret2
Lied 1  2:23
Lied 2  3:23
Lied 3  4:23
Lied 4  5:23
Ende
Optimaler weise soll folgendes herauskommen:

Code: Alles auswählen

Titel;Interpret;Lied 1;3:33
Titel;Interpret;Lied 2;4:44
Titel;Interpret;Lied 3;5:55
Titel2;Interpret2;Lied 1;2:23
Titel2;Interpret2;Lied 2;3:23
Titel2;Interpret2;Lied 3;4:23
Titel2;Interpret2;Lied 4;5:23
Hat jemand Ideen wie ich das angehe? Eine Schleife die von Start bis Ende führt, die ersten 2 Zeilen ausgibt, jeweils nen ; dahinter dann bei jedem durchlauf die Lieder hängt..... Mangels Perl oder Python Kenntnisse würde ich das irgendwie mit Shellscripten umsetzten. Wenn aber ein anderer Weg leichter ist .....

Benutzeravatar
TRex
Moderator
Beiträge: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Script zur Txt zu CSV Umwandlung

Beitrag von TRex » 22.08.2017 16:21:48

Schreit nach awk.

Pseudocode:

Code: Alles auswählen

BEGIN { liste = [] }

/^Start$/ { push(liste, $0) }
/^Ende$/ { push(liste, $0); schreib_in_csv(liste); liste = [] }

Ist nur pseudocode, also nicht lauffähig. Aber von der Idee her würde das so gehen (in bash würde ich es auch hinbekommen, aber eben nur halb so effizient).
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Script zur Txt zu CSV Umwandlung

Beitrag von r4pt0r » 22.08.2017 17:09:03

Wie schon gesagt wurde: Das ist der perfekte Einsatzzweck für awk - strukturierte Textdaten.

Als schnelle Einführung um den Pseudocode zu realisieren kann ich dir das Kapitel zu awk aus "UNIX in a Nutshell" empfehlen:
https://docstore.mik.ua/orelly/unix3/un ... h11_01.htm
Ist aber wirklich _sehr_ knapp gehalten und ohne umschweifende Erklärungen oder Details.

Die bis heute beste Referenz (und dabei nicht mal wirklich Umfangreich oder Langatmig) ist und bleibt "The AWK Programming Language" von seinen Autoren Aho, Weinberger und Kernighan:
https://www.cyberciti.biz/link/download ... -language/
PDF-Direktlink: https://archive.org/download/pdfy-MgN0H ... nguage.pdf

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Script zur Txt zu CSV Umwandlung

Beitrag von eggy » 22.08.2017 17:18:52

Jup, klarer Fall für awk:

Code: Alles auswählen

BEGIN {
    zustand = ""
}

/^Start$/ {  zeile = ""; zustand = "anfang"; next; }
/^Ende$/ {  next;}

zustand=="anfang"{
        titel = $0;
        zustand="titelgelesen"
        next;
        }

zustand=="titelgelesen"{
        interpret = $0;
        zustand="interpretgelesen"
        next;
        }

zustand=="interpretgelesen"{    
        split ($0, neu, "  ")
        print titel ";"  interpret  ";"  neu[1] ";" neu[2]
}
oder so ähnlich

Benutzeravatar
gnude
Beiträge: 1567
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

Re: Script zur Txt zu CSV Umwandlung

Beitrag von gnude » 22.08.2017 21:38:01

Hmm
ich glaube das klappt nicht so wie vorgestellt
weil die Quelldatei im Aufbau zu stark schwankt.
Aber die Idee ist nicht schlecht.

Ich denke aber ich muss das anders angehen...

Die Datei Zeilenweise einlesen und erstmal jede
Zeile auf das Vorkommen eines Wortes und Abwesenheit eines anderen prüfens.
Wenn diese beiden Bedingungen stimmen ... dann wird die Zeile
weiterverarbeitet.

Wie baut man so eine Schleife am besten aus?

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Script zur Txt zu CSV Umwandlung

Beitrag von scientific » 22.08.2017 22:18:03

Hast du mal ein Beispiel so einer Datei (aus der Praxis)?
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Script zur Txt zu CSV Umwandlung

Beitrag von eggy » 22.08.2017 22:22:55

Code: Alles auswählen

/a/ && !  /b/  {print $0;}
gibt jede Zeile aus in der a aber nicht b drin ist

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script zur Txt zu CSV Umwandlung

Beitrag von Meillo » 23.08.2017 08:12:20

TRex hat geschrieben: ↑ zum Beitrag ↑
22.08.2017 16:21:48
Schreit nach awk.
r4pt0r hat geschrieben: ↑ zum Beitrag ↑
22.08.2017 17:09:03
Wie schon gesagt wurde: Das ist der perfekte Einsatzzweck für awk - strukturierte Textdaten.
eggy hat geschrieben: ↑ zum Beitrag ↑
22.08.2017 17:18:52
Jup, klarer Fall für awk:
Schoen dass hin und wieder awk empfohlen wird! :-)

... hier moechte ich die Begeisterung aber ein wenig daempfen, denn CSV-Daten mit awk zu bearbeiten ist wie XML mit awk zu bearbeiten: Das geht in den einfachen Faellen schon, aber es bricht wenn unerwartetes kommt.

Bei CSV ist der typische Fall ein Trenner (hier Strichpunkt) im Feldwert. Man darf also die Werte nicht einfach ausgeben, sondern muss eine Feldwertausgabefunktion schreiben, die diesen Fall beruecksichtigt und folglich den Feldwert in Anfuehrungszeichen einschliesst. Dazu ist es aber auch notwendig, dass man dann Anfuehrungszeichen im Feldwert behandelt ... typischerweise werden die verdoppelt um sie zu escapen. (Leider existiert kein einheitlicher CSV-Standard; es gibt einige Varianten.) Mit Newlines in Feldwerten kann man nochmal Probleme haben, was aber im konkreten Anwendungsfall nicht aufzutreten scheint. All diese Faelle zu bedenken und korrekt zu handhaben ist dann in awk nicht mehr ganz so einfach, wie es am Anfang ausgesehen hat. Darum ist fuer mich die Empfehlung: Wenn man CSVs lesen und schreiben will, dann sollte man eine fertige CSV-Bibliothek verwenden, die es fuer die meisten *modernen* Scriptsprachen gibt ... ebenso: Wenn man XML lesen und schreiben will, dann sollte man das ueber eine XML-Bibliothek tun.

Ich freue mich sehr, wenn awk eingesetzt wird, schliesslich ist es meine Lieblingsprogrammiersprache, zudem habe ich im anderen Thread selber eine awk-Loesung fuer ein CSV-Problem gepostet, aber eigentlich sollte man CSV-Probleme nicht mit awk loesen ... ausser man strebt nur 90%-Loesungen an.


Nichts desto trotz: awk ist eine wundervolle Sprache und das von r4pt0r verlinkte Buch ein Juwel der Computerliteratur. :THX:
Use ed once in a while!

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script zur Txt zu CSV Umwandlung

Beitrag von inne » 23.08.2017 09:51:00

Deswegen habe ich mir mal einen Wrapper um Perls DBI/DBD-Treiber DBD::CSV geschrieben. Der Datenbanktreiber (Parser) macht es eigentlich richtig.
Zuletzt geändert von Anonymous am 23.08.2017 14:31:48, insgesamt 2-mal geändert.

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Script zur Txt zu CSV Umwandlung

Beitrag von uname » 23.08.2017 10:51:22

Ich nutze awk und Perl. Spätestens bei Problemen dieser Größenordnung greife ich meist auf Perl zurück. Bibliotheken nutze ich dafür nicht. Ähnlich wie bei den awk-Beispielen benötigt man Zustände (in Form von Variablen), um die Bearbeitung korrekt zu steuern. Das geht bei kompleren Problemen mit Perl besser als mit awk. Bei Interesse: https://de.wikipedia.org/wiki/Endlicher_Automat . Vielleicht magst du mal den zugehörigen endlichen Automaten aufzeichnen und uns bereitstellen.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script zur Txt zu CSV Umwandlung

Beitrag von inne » 23.08.2017 11:55:40

uname hat geschrieben: ↑ zum Beitrag ↑
23.08.2017 10:51:22
Bibliotheken nutze ich dafür nicht.
Bei so einmaligen Aufgaben, wohl nicht das Problem. Bei wiederkehrenden Aufgaben nutze ich explizit eigenen und vor allem die vom Debian-Repository/System bereitgestellten. Denn wenn man einmal was ändern muss, tut man es dann in der API/Bibliothek und alles läuft damit dann weiter.
Bzw. die Entwickler ändern für einen die Fehler und Anpassungen...

Aber gut ;-)

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Script zur Txt zu CSV Umwandlung

Beitrag von r4pt0r » 23.08.2017 15:00:42

Meillo hat geschrieben: ↑ zum Beitrag ↑
23.08.2017 08:12:20
CSV-Daten mit awk zu bearbeiten ist wie XML mit awk zu bearbeiten
Es ging ja auch erstmal darum überhaupt eine CSV zu erzeugen ;)
Bearbeiten geht bis zu einem gewissen Grad noch ganz brauchbar, aber Perl (+DBI) ist recht schnell wesentlich einfacher und überlegener...

Der Beispieldatensatz würde sich BTW auch perfekt in einfache JSON-Strukturen abbilden lassen:

Code: Alles auswählen

Interpret {
  Titel {
    "Lied 1":  3:33,
    "Lied 2":  3:33,
    "Lied 3":  3:33
  },
  Titel2 {
    "Lied 1": 3:33
  }
}    

Interpret2 {
  Titel {
    "Lied 1":  3:33,
    "Lied 2":  3:33,
    "Lied 3":  3:33
  },
  Titel2 {
    "Lied 1": 3:33
  }
}    
Hätte den Vorteil, dass man nach Interpreten Gruppieren kann.
Erzeugen lässt sich das auch weder recht gut mit awk, um JSON dann aber weiter zu bearbeiten oder z.b. in eine DB zu füttern ist Perl wieder die bessere Wahl.
Für die meisten solcher Aufgaben gibt es i.d.r. bereits was passendes auf CPAN - das ist dann erste Wahl bevor man anfängt selber was zusammenzufrickeln das meistens in einem Gewirr aus Ausnahmen für Grenzfälle endet - und JSON ist hierbei ein ziemliches Biest!

Nichts desto trotz: awk ist eine wundervolle Sprache und das von r4pt0r verlinkte Buch ein Juwel der Computerliteratur. :THX:
Steht bei mir direkt neben "The C Programming Language" - beide sind IMHO die mit Abstand am besten verfassten Bücher zu Programmiersprachen: Präzise, kompakt, strukturiert und ohne Umschweife auf den Punkt gebracht. Und das wichtigste: Die Autoren erklären auch WARUM manches auf eine bestimmte Weise implementiert/gelöst wurde. Dadurch bekommt man ein deutlich besseres Grundverständnis für die Sprache und geht völlig anders mit ihr um.
Bei beiden Büchern hat man in deutlich unter 100 Seiten praktisch 95% von allem abgedeckt was man im Alltag braucht. Schade dass solche Bücher nicht mehr geschrieben werden :roll:

Antworten