csv-Datei mit UNIX zurecht stutzen und Daten in xls-Datei laufend abspeichern

richko

richko

Grünschnabel
Guten Abend,

nach langem hin- und her und einigen (für mich als Laie) doch sehr zeitaufwändigen Versuchen wende ich mich vertrauensvoll an Mitglieder dieses Forums, die mir ggf weiterhelfen können.

Zum Sachverhalt:

Für ein Projekt (Studium) muss ich aus zahlreichen csv-Dateien (mit unterschiedlicher Zeilenanzahl) Daten in eine einzige XLS-Datei bekommen um diese dann u.a. grafisch auswerten und wiederum in einer weiteren XLS-Datei weiter verarbeiten zu können.

Ich hab den Tipp bekommen, dass man statt mit VBA mit ein paar Zeilen UNIX-Programmcode das ganze doch erheblich vereinfachen kann.

Das hat jedoch einen Haken -> Ich kenne niemanden (mich eingeschlossen) der sich mit UNIX auskennt… 

Vllt. kann mir jemand von Euch weiterhelfen???

Um das ganze zu vereinfachen habe ich hier die Struktur von 2 der besagten csv-Dateien eingefügt. Einmal die Daten aus einer kürzeren und einmal die Daten aus einer längeren.

Eine Kurze:
# ExPostInformationGenerationWind
#
# FCRT [CreationTimeStamp]
# AWPL [ConnectingArea] [TimeStamp] [ActualWindEnergy] [PublicationTimeStamp] [ModificationTimeStamp]
# TELI [LineNumbers]
#
FCRT 2009-12-22T16:43:21+01:00
AWPL 10YDE-EON------1 2009-10-25T23:00:00+01:00 3085.8 2009-11-20T20:19:07+01:00
AWPL 10YDE-EON------1 2009-10-25T23:15:00+01:00 2921.0 2009-11-20T20:19:07+01:00
AWPL 10YDE-EON------1 2009-10-25T23:30:00+01:00 2782.2 2009-11-20T20:19:07+01:00
AWPL 10YDE-EON------1 2009-10-25T23:45:00+01:00 2780.3 2009-11-20T20:19:07+01:00
TELI 12

Eine Lange:
# ExPostInformationGenerationWind
#
# FCRT [CreationTimeStamp]
# AWPL [ConnectingArea] [TimeStamp] [ActualWindEnergy] [PublicationTimeStamp]
# TELI [LineNumbers]
#
FCRT 2009-12-22T16:43:21+01:00
AWPL 10YDE-ENBW-----N 2009-12-12T03:00:00+01:00 40.0 2009-12-12T06:00:12+01:00
AWPL 10YDE-ENBW-----N 2009-12-12T03:15:00+01:00 38.6 2009-12-12T06:00:12+01:00
AWPL 10YDE-ENBW-----N 2009-12-12T03:30:00+01:00 40.4 2009-12-12T06:00:12+01:00
AWPL 10YDE-ENBW-----N 2009-12-12T03:45:00+01:00 42.9 2009-12-12T06:00:12+01:00
AWPL 10YDE-EON------1 2009-12-12T03:00:00+01:00 1041.5 2009-12-12T06:00:12+01:00
AWPL 10YDE-EON------1 2009-12-12T03:15:00+01:00 1101.6 2009-12-12T06:00:12+01:00
AWPL 10YDE-EON------1 2009-12-12T03:30:00+01:00 1121.3 2009-12-12T06:00:12+01:00
AWPL 10YDE-EON------1 2009-12-12T03:45:00+01:00 1115.3 2009-12-12T06:00:12+01:00
AWPL 10YDE-RWENET---I 2009-12-12T03:00:00+01:00 271.0 2009-12-12T06:00:11+01:00
AWPL 10YDE-RWENET---I 2009-12-12T03:15:00+01:00 291.0 2009-12-12T06:00:11+01:00
AWPL 10YDE-RWENET---I 2009-12-12T03:30:00+01:00 336.0 2009-12-12T06:00:11+01:00
AWPL 10YDE-RWENET---I 2009-12-12T03:45:00+01:00 336.0 2009-12-12T06:00:11+01:00
AWPL 10YDE-VE-------2 2009-12-12T03:00:00+01:00 514.0 2009-12-12T06:00:13+01:00
AWPL 10YDE-VE-------2 2009-12-12T03:15:00+01:00 542.0 2009-12-12T06:00:13+01:00
AWPL 10YDE-VE-------2 2009-12-12T03:30:00+01:00 510.0 2009-12-12T06:00:13+01:00
AWPL 10YDE-VE-------2 2009-12-12T03:45:00+01:00 510.0 2009-12-12T06:00:13+01:00
TELI 24

Die Daten auf die es ankommt sind fett markiert. Wie man sieht geht’s bei der Formatierung von Datum und Uhrzeit schon los:

2009-12-12T03:00:00+01:00

Die Zelle sollte so getrennt sein, das man damit arbeiten kann; 12.12.2009 (in einer Zelle) und die Uhrzeit 03:00 in einer weiteren Zelle.

Die Zahlen in der Spalte [ActualWindEnergy] sind ebenfalls alles andere als anwenderfreundlich… ein Komma als Dezimaltrennzeichen
Wäre wünschenswert…

Idealfall einer Lösung wäre die, dass automatisiert alle csv-Dateien in einem Verzeichnis (entsprechend der Angaben oben) „beschnitten“ und modifiziert werden, und automatisch in einer xls-datei laufend gespeichert werden, ohne bereits eingelesene Daten zu überschreiben. Das ganze in 3 Spalten: [ConnectingArea], [TimeStamp] und [ActualWindEnergy].

Wer hat Ideen oder Lösungsvorschläge? Danke vorab.
 
Hallo

Das sollte mit Python gehen
CSV parsen, dann per re zurechtstutzen und dann alles in eienr satei speichern (appand).

geht aber auch bestimmt per bash oder perl

mfg
schwedenmann
 
@schwedenmann

Danke für die prompte Antwort.

Ich habe den Hinweis bekommen, dass es so per UNIX gehen sollte:

cat Importdatei
grep "^AWPL"
sed "ersetze Punkt durch Komma" und "Formatiere Datum"
>> Datendatei


Problem ist nur, dass UNIX für mich ein böhmisches Dorf ist... :hilfe2:

Kann mir wer den Dreizeiler evtl. so umsetzen dass es auf Knopfdruck geht?

Das wäre Spitze!
 
Hallo richko,
natürlich sind die Anforderungen umsetzbar, aber hast du überhaupt Zugang zu einem LINUX-Rechner?
Wäre es für dich nicht einfacher, das Thema in Excel zu lösen?
Gruß zst
 
Hallo zst,

es ist doch einfacher ein kleines UNIX-Programm unter einer emulierten Linux-Umgebung laufen zu lassen, statt tausende Zeilen Programmcode unter VBA zu schreiben (???).

Hab schon zahlreiche Versuche in dieser Hinsicht unternommen, aber die Lösung ist alles andere als hilfreich. Zum einen ist es sehr aufwendig, Datum und Uhrzeit zu trennen, zum anderen klappt das ersetzen des Dezimaltrennzeichens (Komma statt Punkt) ebenso wenig, wie das automatisierte importieren und anfügen (ohne überschreiben bestehender Daten) in eine Excel-Datei... :(
 
Du hast die Syntax ja schon fast hingeschrieben. Zumindest zum Ersetzen kannst Du den Befehl 'tr' benutzen:
Code:
grep "^AWPL" deine_datei | tr '.' ','
Fuer die Uhrzeit muesste
Code:
sed  -e 's/\(2009\)-\([0-9]\{1,2\}\)-\([0-9]\{1,2\}\)T\([012][0-9]\):\([0-6][0-9]\)\(.*\)/\3.\2.\1\n\4:\5/' test.text
ein guter Ansatzpunkt sein.
 
Zuletzt bearbeitet:
Hallo richko,

wenn du den Code von rikola erweiterst, hast du es ja.
Code:
grep "^AWPL" deine-Datei | sed "s/T-/?-/g" | tr '.' ',' | tr '+' ';' | tr 'T' ';' | sed "s/?-
/T-/g" | tr ' ' ';'  >>GESAMTDATEI.csv
Statt ";" ggf. das richtige Excel-Trennzeichen für die csv-Datei benutzen.
Und beim Excel-Import ggf. noch das korrekte Datum-Format wählen, falls das nicht automatisch erkannt wird.
Gruß zst

ERGEBNIS:
Code:
AWPL;10YDE-ENBW-----N;2009-12-12;03:00:00;01:00;40,0;2009-12-12;06:00:12;01:00
AWPL;10YDE-ENBW-----N;2009-12-12;03:15:00;01:00;38,6;2009-12-12;06:00:12;01:00
AWPL;10YDE-ENBW-----N;2009-12-12;03:30:00;01:00;40,4;2009-12-12;06:00:12;01:00
AWPL;10YDE-ENBW-----N;2009-12-12;03:45:00;01:00;42,9;2009-12-12;06:00:12;01:00
AWPL;10YDE-EON------1;2009-12-12;03:00:00;01:00;1041,5;2009-12-12;06:00:12;01:00
AWPL;10YDE-EON------1;2009-12-12;03:15:00;01:00;1101,6;2009-12-12;06:00:12;01:00
AWPL;10YDE-EON------1;2009-12-12;03:30:00;01:00;1121,3;2009-12-12;06:00:12;01:00
AWPL;10YDE-EON------1;2009-12-12;03:45:00;01:00;1115,3;2009-12-12;06:00:12;01:00
AWPL;10YDE-RWENET---I;2009-12-12;03:00:00;01:00;271,0;2009-12-12;06:00:11;01:00
AWPL;10YDE-RWENET---I;2009-12-12;03:15:00;01:00;291,0;2009-12-12;06:00:11;01:00
AWPL;10YDE-RWENET---I;2009-12-12;03:30:00;01:00;336,0;2009-12-12;06:00:11;01:00
AWPL;10YDE-RWENET---I;2009-12-12;03:45:00;01:00;336,0;2009-12-12;06:00:11;01:00
AWPL;10YDE-VE-------2;2009-12-12;03:00:00;01:00;514,0;2009-12-12;06:00:13;01:00
AWPL;10YDE-VE-------2;2009-12-12;03:15:00;01:00;542,0;2009-12-12;06:00:13;01:00
AWPL;10YDE-VE-------2;2009-12-12;03:30:00;01:00;510,0;2009-12-12;06:00:13;01:00
AWPL;10YDE-VE-------2;2009-12-12;03:45:00;01:00;510,0;2009-12-12;06:00:13;01:00
 
Zuletzt bearbeitet:
@rikola & zst:

Danke - Das sieht ja sehr gut aus.

Wenn ihr mir jetzt noch verratet, mit (bzw. in) welchem Proggi ich aus dem Code ein kleines Programm zimmern kann, bin ich euch noch mehr dankbar.

Und gegen das Vorhaben, dieses Programm dann in einer emulierten Linux-Umgebung unter Windows auszuführen ist nichts einzuwenden? Mal abgesehen davon, dass Windows im Spiel ist... ;-)
 
Das einzige Problem, dass eventuell bestehen koennte, ist, dass Zeilenumbrueche in Windows und Unix unterschiedliche Zeichen haben. Wenn Du z.B. unter Cygwin arbeitest, sollte das jedoch kein Problem sein.
Du kannst eine Datei erstellen 'formatiere_meine_Daten_fuer_excel_um.sh' und die Zeilen dort hinein schreiben:
Code:
#!/bin/bash
grep "^AWPL" $1 | kram-zum-ersetzen-der-Zeichen > temporaere_Datei.text
sed  -e '... kram-zum-ersetzen-der-Uhrzeit...' temporaere_Datei.text >> gesamtdatei.csv
Durch das '$1' in der ersten Zeile musst Du dann beim Aufrufen der Datei den Namen der Eingabedatei mituebergeben (mittels 'bash formatiere_meine_Daten_fuer_excel_um.sh deine_urspruengliche_Datei')
 
Danke noch mal an zst und rikola für die schnelle Hilfe – und auch an alle anderen, die sich Gedanken darüber gemacht haben, wie man dieses Problem lösen könnte.

Also, ich hab mir Cygwin besorgt und entsprechend installiert.

Frage:

Wie könnte man die Schritte wiederum automatisieren, mit einer Datei, die unter windows ausführbar ist, aber durchaus auf Cygwin zugreifen darf???

In etwa in dieser Reihenfolge:

***Ausführende Datei anklicken***

Cygwin wird automatisch geladen

Einlesen des Quellcodes von zst und rikola

(Ausführung)

***Ausführung beendet***​

Wenn ich rikolas letzten Beitrag richtig verstanden habe, geht das ja in die richtige Richtung.

Allerdings weiß ich nicht, wie der Code des gesamten Programms dann auszusehen hätte. Geschweige denn mit welchem Programm ich wiederum so eine Batch-Datei erstellen kann und wie die Endung dieser auszusehen hätte…

DANKE für die weitere Hilfe.
 
Hallo,

ich hab ein paar weitere Versuche durchgeführt - allerdings ohne Erfolg :-(

Hat jemand noch ne Idee?
 
An sich musst Du ja nur eine bat-Datei erzeugen (das Praktische an Windows ist ja, dass die Dateiart mit ihrer Endung festgelegt wird ;->), mit der Du Cygwin aufrufst und dabei das Skript, dass ich im Beitrag 10 angedeutet habe, mit den zugehoerigen Parametern aufrufst. Das ist allerdings zu Windows/Cygwin-spezifisch fuer mich, als dass ich da weiterhelfen koennte.
 
Wenn du auf "Cygwin wird automatisch geladen" verzichtest, kannst du das Skript doch einfach im Cygwin aufrufen. Cygwin öffnen ist ja nur ein Doppelklick.
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Mit AWK verschiedene Felder verschiedener Zeilen vergleichen

Mein Server versendet SPAM in Massen

xrandr: cant open display

Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16

Zurück
Oben