Datum in Textdatei umwandeln - sed ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Pitfall
Beiträge: 11
Registriert: 19.09.2011 07:54:57

Datum in Textdatei umwandeln - sed ?

Beitrag von Pitfall » 09.04.2018 09:44:21

Hallo zusammen,

wir müssen Daten aus einem DB-System in MySQl übertragen. Das geht leider nur über einen Dateiexport, den wir dann aber in MySQL importieren könnten. Das ganze muss als Skript laufen.
Die Anwendung, aus der die Daten kommen erstellt eine CSV-Datei. Eine Spalte enthält ein Datum, dessen Format wir beim Erstellen des Exports leider nicht anpassen können. Hier mal eine Beispielzeile:

Code: Alles auswählen

01.02.2018 00:00:00;1237,000000;394,000000;3020,000000;0,000000;619,000000;
Die Uhrzeit (00:00:00) wird nicht benötigt und müsste entfernt werden. Ebenso müsste das Komma gegen einen Punkt als Dezimaltrenner ersetzt werden. Beides würden wir wohl hinbekommen.
Probleme macht uns aber derzeit das Datum. Aus "01.02.2018" müsste "2018-02-01" werden, damit MySQL es als Datum erkennt und wir dort entsprechend sortieren können.

Ich vermute mal, das "sed" hier die erste Wahl ist. Die ersten 10 Zeichen müssten "nur" umsortiert und der . gegen ein - ersetzt werden.

Niemand soll mir hier meine Lösung präsentieren (würde mich aber natürlich schon freuen).
Sehr hilfreich wäre allerdings ein gutes und verständliches Tutorial, mit dem ich selbst auf die Lösung komme, denn zukünftig werden wohl ähnliche Fälle auf mich lauern. Ich habe schon umfangreich recherchiert, komme einer Lösung aber nicht näher.

Also, ich bin für jeden Tipp dankbar!

Beste Grüße

Pitfall

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von MSfree » 09.04.2018 09:50:27

Pitfall hat geschrieben: ↑ zum Beitrag ↑
09.04.2018 09:44:21
Ich vermute mal, das "sed" hier die erste Wahl ist.
Das ist Geschmacksache.

Ich kenne mich mit awk besser aus und würde es daher mit awk machen.

Gunman1982
Beiträge: 923
Registriert: 09.07.2008 11:50:57
Lizenz eigener Beiträge: MIT Lizenz

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von Gunman1982 » 09.04.2018 10:28:45

Naja man köööööönnte nach Beispielen googeln oder nach einem Tutorial
Beispiel: https://tty1.net/sed-tutorium/sed-tutor ... r-selektiv

Für das was du vorhast wäre wahrscheinlich dies eine mögliche sed Lösung:

Code: Alles auswählen

echo "01.02.2018 00:00:00;1237,000000;394,000000;3020,000000;0,000000;619,000000;" \
| sed -e 's/^\([0-3][0-9]\)\.\([0-1][0-9]\)\.\([0-9][0-9][0-9][0-9]\) 00\:00\:00/\3-\2-\1/g;s/,/./g'
2018-02-01;1237.000000;394.000000;3020.000000;0.000000;619.000000;

owl102

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von owl102 » 09.04.2018 10:53:52

Ich würde dafür weder sed noch awk nehmen, sondern das, was bash zum Extrahieren von Sub-Zeichenketten anbietet:

Code: Alles auswählen

${line:offset:length}
Also zum Beispiel

Code: Alles auswählen

${line:0:2}
für den Tag usw.

Siehe auch: http://mywiki.wooledge.org/BashSheet#Pa ... Operations

RobertDebiannutzer
Beiträge: 385
Registriert: 16.06.2017 09:52:36

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von RobertDebiannutzer » 09.04.2018 18:35:38

Das macht Spaß... :D

Code: Alles auswählen

sed -E 's/\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}//;s/\,/\./g;s/^([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/'
2018-02-01;1237.000000;394.000000;3020.000000;0.000000;619.000000;
@Gunman1982: Kann die Zeit nicht auch eine andere als 00:00:00 sein?

Gunman1982
Beiträge: 923
Registriert: 09.07.2008 11:50:57
Lizenz eigener Beiträge: MIT Lizenz

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von Gunman1982 » 09.04.2018 18:46:34

RobertDebiannutzer hat geschrieben: ↑ zum Beitrag ↑
09.04.2018 18:35:38
@Gunman1982: Kann die Zeit nicht auch eine andere als 00:00:00 sein?
Klar aber ich bin jetzt von den angegebenen Beispiel Daten ausgegangen. Und weiteres Transfer-Wissen/Können hätte ich dann erwartet. Ich hoffe auch das Pitfall etwaige Lösungen auch erst versucht zu verstehen und nicht einfach auf die vielleicht wichtigen Daten loslässt. :wink:

RobertDebiannutzer
Beiträge: 385
Registriert: 16.06.2017 09:52:36

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von RobertDebiannutzer » 09.04.2018 21:44:06

Am schicksten wird's glaub' ich mit sed, wenn man unsere beiden Versionen zusammenschustert:

Code: Alles auswählen

sed -E 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{4})\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}/\3-\2-\1/;s/\,/\./g'
Für @Pitfall:
Der Befehl:
Finde
"Am Anfang des Strings zwei Ziffern, dann ein Punkt, dann wieder zwei Ziffern, dann wieder ein Punkt und dann noch vier Ziffern"
und stelle die gefundenen Blöcke durch "-" getrennt um.
Finde daran anschließend
"ein Leerzeichen, dann zwei Ziffern, dann ein Doppelpunkt, dann wieder zwei Ziffern, dann wieder ein Doppelpunkt und dann noch zwei Ziffern"
und lösche das.
Schlussendlich wandele noch alle Kommata in Punkte um.
Schritt 1 und 2 werden dabei zusammengefasst, Schritt drei global auf den string angewandt (deswegen das g).

Pitfall
Beiträge: 11
Registriert: 19.09.2011 07:54:57

Re: Datum in Textdatei umwandeln - sed ?

Beitrag von Pitfall » 10.04.2018 14:22:01

Wow, hier sind Könner am Werk!

In diesem konkreten Beispiel kommen keine anderen Uhrzeiten als 00:00:00 vor. Pro Tag wird ein Satz Daten geliefert, jeweils mit der Uhrzeit 00:00:00.

Später kann es allerdings vorkommen, dass verschiedene Uhrzeiten eine Rolle spielen. Aktuell nicht.

Momentan bin ich dabei, Eure Vorschläge zu verstehen. Gerade sed ist "ein wenig" kryptisch. Für die anschließende Erläuterung bin ich wirklich sehr dankbar!!

Ich muss noch etwas probieren und melde mich, wenn ich zu einer Lösung gekommen bin, noch einmal in diesen Thread.

Bis dahin, noch einmal vielen Dank!

Pitfall

Antworten