CSV Auslesen & Umstrukturieren | Notfall !!!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Engl.Blackmore
User
Beiträge: 5
Registriert: Samstag 4. September 2010, 18:43

Hallo,

ich hatte eine kleine Aufgabe zugestellt bekommen, von der Ich ausging, dass ich sie Ende nächster Woche hätte fertig machen sollen. Mir wurde nun mitgeteilt, dass das "kleine Programm" bis diesen Montag fertig sein soll....Horrorszenario. Hab jetzt gerade dieses Gefühl von Chaos und den Geschmack von Eisen im Mund! Kurzum: Hilfe! Ich schreibe instinktiv in dieses Forum, weil mir im Hinterkopf geblieben ist, dass Python für "Schnippelzeug" ziemlich effektiv ist, also man wenig zu programmieren hat. Darum gehts....auch wenn ich kaum bis keine Ahnung von der Programmiersprache habe. Ich bitte darum micht nicht zu verurteilen. Ich tue dieses Aufruf aus Verzweilung und weiß sonst nicht wie ich dieses Problem so schnell lösen kann.

Aufgabe:

Das ganze CSV Material befindet sich hier: http://www.2shared.com/file/6A0qP4uk/Dateien.html

(Unter "Save file to your PC: click here" ganz unten rechts)

1) Eine CSV Datei soll ausgelesen & umstrukturiert werden, d.h. die ursprüngliche CSV Datei ordnet Kategorien & Werte "untereinander" an. Siehe im Anhang Beispiel "CSV_Urspruenglich.Jpg".

Bild

Diese CSV soll nun gewissermaßen fast komplett (nicht alle Daten sind wichtig) ausgelesen und die neue CSV abgespeichert werden.:

[- bei "Time QRS PVC BIG COUP TRIP VE run VE tachy SVE RR pause Brady NN delay SVE tachy HR min HR mean HR max Noise PAT" sind nur die Totalwerte wichtig "Total 8830 2 0 0 0 0 0 3 0 0 0 0 63 82 101 3 1"
- bei "Time HR Symindex TotalPow Pow VLF LF HF LF/HF LF-Norm HF-Norm f(Pmax) Pmax" ist nur die erste und die letzte Zeile der Werte wichtig. Das sieht man auch ganz gut in der CSV Datei im Link.

Dieses mal ordnet die CSV Datei Kategorien & Werte "nebeneinander" an. Im Anhang erkennt man sofort was genommen werden soll "CSV_Muster_Einzelnd.Jpg"

Bild

Am "besten" (entschuldigt mich, wenn ich mich so rauslehne....) wäre es, wenn das Programm bei einer Pfadangabe einen ganzen Ordner nach diesem Prinzip abarbeitet, d.h. hat man 400 CSV Dateien in einem Ordner dann lässt man das Programm laufen und bei einem mal hat man 400 umstrukturierte CSV Dateien

2) Alle umstrukturieren CSV Dateien werden in einer zusammengefasst, d.h. die Werte werden untereinander Zeilenweise eingefügt....."

Bild

Bitte dringend um Hilfe.....:(

Gruß

PS: Im Materiallink befinden sich alle CSV Dateien (Testdatensätze + Musterform)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Darum gehts....auch wenn ich kaum bis keine Ahnung von der Programmiersprache habe.
Hm? Wieso hast du dann eine Aufgabe dieser Art? Und wie ist die Vorgabe für die Lösung bzw. den Weg zur Lösung?

Grundsätzlich kannst du nicht erwarten, dass dir hier jemand deine Hausaufgaben machte, siehe auch hier.

Grundsätzlich geht das natürlich mit Python. Aber die Lösung hat sicherlich mehr als "ein paar Zeilen" Code. Und wenn du keine Ahnung von Python bzw. dessen Grundlagen hast, wirst du die Lösung sicherlich auch nicht verstehen...

Gruß, noisefloor
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ein Programm wird dir hier sicher niemand schreiben, von der Idee solltest du dich also verabschieden. Stelle konkrete Fragen und poste dazu Code auf dem man aufbauen kann. Darauf gibt es in der Regel schnelle und gute Antworten.

Sebastian
Das Leben ist wie ein Tennisball.
Engl.Blackmore
User
Beiträge: 5
Registriert: Samstag 4. September 2010, 18:43

Grundsätzlich kannst du nicht erwarten, dass dir hier jemand deine Hausaufgaben machte, siehe auch hier.
Grundsätzlich geht das natürlich mit Python. Aber die Lösung hat sicherlich mehr als "ein paar Zeilen" Code. Und wenn du keine Ahnung von Python bzw. dessen Grundlagen hast, wirst du die Lösung sicherlich auch nicht verstehen...
Ich versteh natürlich den Hintergedanken aber es gibt nunmal Situationen...da steht man einfach mit dem Rücken zur Wand. Ich bin selbst ein Autodidakt und weiß wieviel Kraft & Mühe es kostet sich "etwas" komplett selbst anzueignen. Aber es interessiert hier niemanden, wenn ich schreibe ich spiele 10 Jahre Gitarre und bin beim Programmieren noch nicht an dem Punkt angelangt, wo ich "abstrakte" Ideen (ah, ja. - so und so löse ich das. Erst einlesen mittels for-schleife, dann string-matching, dann ersetzen ect etc) ins praktische so SCHNELL umsetzen kann. Es geht mir nicht um das Problem an sich, sondern um die Zeit. Es wäre dasselbe als, wenn man einem Programmierer sagt (der keine Ahnung von einem Instrument hat) nimm dir diese 2 Stücke und tabularisiere mal das komplette Stück in 2 Tagen. Dazu gehört Erfahrung, Gehörtraining, Instrumentenkenntniss, Notation und schlag mich tot einfach zum Standardreportoire.

Hier geht es nicht um eine Uniaufgabe, sondern um einen Gefallen, der irrtürmlicherweise zu einer Aufgabe geworden ist. Ich kann das jetzt auch nicht mehr rückgängig machen. Dazu sitze ich zu tief drinn. Und programmiert habe ich bereits (PHP/Java) aber das ist auch schon wieder 1 1/2 bis 2 Jahre her. Ich kenne die Begriffe Schleifen, Funktionen, Klassen etc.

Miese Situation. Kennt das denn niemand?
problembär

Ich weiß nicht: Was für'n OS ist denn das?

Außerdem: Das sieht nach medizinischen Daten aus: Was, wenn jemand so ein hier gepostetes Skript drüberlaufen läßt, ein Arzt verwendet das Ergebnis so, und ein Patient hat davon gesundheitlichen Schaden?
Wie stellst Du Dir das vor?

Meistens muß ein Skript auch ausgiebig getestet und angepaßt werden. Wie soll das gehen, wenn Du die Sprache (noch) nicht kannst?

Schreib' lieber in einer Sprache, die Dir vertraut ist.
Ich kenne PHP zwar nicht so gut, aber um Daten umzustellen, sollte es auch recht effektiv sein.

Ansonsten wende Dich an einen (hoffentlich gut berufshaftpflichtversicherten) Programmierer gegen Geld: Dürfte nicht billig werden als Notfall am Wochenende.

Hier gibt's sozusagen nur "Nachbarschaftshilfe". Dein Problem scheint dafür 'ne Nummer zu groß zu sein. Und unter Druck setzen lassen wir uns hier schonmal gar nicht, es ist Deine Notlage, nicht unsere.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Engl.Blackmore: Hast du die gleiche Anfrage denn sicherheitshalber auch in anderen Programmier-Foren gestellt? ;-)

EDIT: Das Vertauschen von Zeile und Spalte beherrschen Excel und OOo.org Calc mit Bordmitteln. Nennt sich "Transponieren".

Gruß, noisefloor
Zuletzt geändert von noisefloor am Samstag 4. September 2010, 21:05, insgesamt 1-mal geändert.
BlackJack

Die Aufgabe erscheint mir jetzt aber auch nicht *so* kompliziert, das jemand der schon Programmiererfahrung hat, sie nicht an zwei Tagen irgendwie lösen könnte.

Also ein paar Hinweise: Das Tutorial in der Python-Dokumentation durcharbeiten, um die Grundlagen und grundlegenden Datentypen und Konzepte von Python kennen zu lernen. Und speziell für diese Aufgabe ist `os.listdir()` oder das `glob`-Modul interessant, sowie das `csv`-Modul. Alles in der Standardbibliothek enthalten.
Engl.Blackmore
User
Beiträge: 5
Registriert: Samstag 4. September 2010, 18:43

problembär hat geschrieben:Ich weiß nicht: Was für'n OS ist denn das?
Meins....nur XP.
problembär hat geschrieben: Außerdem: Das sieht nach medizinischen Daten aus: Was, wenn jemand so ein hier gepostetes Skript drüberlaufen läßt, ein Arzt verwendet das Ergebnis so, und ein Patient hat davon gesundheitlichen Schaden?
Wie stellst Du Dir das vor?
Nein, das ist quatsch. Die Daten sind zwar medizinisch aber sollen einfach nur "vorbereitet" werden für eine kleine Analyse. Dabei helfe ich einer Studentin. Es hat keine Auswirkungen auf Patienten.
problembär hat geschrieben: Hier gibt's sozusagen nur "Nachbarschaftshilfe". Dein Problem scheint dafür 'ne Nummer zu groß zu sein. Und unter Druck setzen lassen wir uns hier schonmal gar nicht, es ist Deine Notlage, nicht unsere.
a) ich setze niemanden unter Druck, also bleib bitte gelassen b) deswegen war es auch als Bitte gedacht. Ich habe selber oft genug anderen Mitmenschen ohne Bedingung helfen können und tue es heute noch. Ich verstehe auch nicht was daran so schlimm ist. Gerade im oben genannten Thread ist mir sofort das Wort "Lutscher" aufgefallen. Es scheint als ob man einen regelrechten Hass auf Menschen schürrt, die mit einer großen oder kleinen bedingslosen "Bitte" kommen. Verurteile nie Leute in dessen Situation du ( wahrscheinlich ) nie gewesen bist. Aber natürlich. Ich hab nichts zu melden. Ich frage lediglich und schaue wie die Antworten ausfallen.
noisefloor hat geschrieben: @Engl.Blackmore: Hast du die gleiche Anfrage denn sicherheitshalber auch in anderen Programmier-Foren gestellt? ;-)EDIT: Das Vertauschen von Zeile und Spalte beherrschen Excel und OOo.org Calc mit Bordmitteln. Nennt sich "Transponieren".
.
Ja, entschuldige. Ich bekomm den Post dort nicht gelöscht. Jedenfalls sehe ich auf Anhieb unter "Bearbeiten" keine Möglichkeit es zu löschen. Noch hat ja keiner drauf geantwortet. Das Transponieren macht soviel Sinn nicht, weil man das ja per Hand machen muss. Und es geht darum ~ 400 Sätze auf einmal rauszulesen (und auch nicht alles) und dann zu transponieren. Die automische Variante scheint da sicherlich effizienter...
BlackJack hat geschrieben:Also ein paar Hinweise: Das Tutorial in der Python-Dokumentation durcharbeiten, um die Grundlagen und grundlegenden Datentypen und Konzepte von Python kennen zu lernen. Und speziell für diese Aufgabe ist `os.listdir()` oder das `glob`-Modul interessant, sowie das `csv`-Modul. Alles in der Standardbibliothek enthalten.
Danke für den Hinweis. Ich glaub zwar nicht, dass ich alles in kurzer Zeit durcharbeiten & transferieren aber mal schauen...
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie wäre es, wenn du einfach mal anfängst, *selbst* an der Lösung zu arbeiten? Dabei kannst deinen Fortschritt (möge er noch so kleinschrittig sein) gern hier mitteilen. Das würde u.U. nämlich die Bereitschaft erhöhen, dir zu helfen. :)
Engl.Blackmore
User
Beiträge: 5
Registriert: Samstag 4. September 2010, 18:43

Ich lese die ganze Zeit Tutorials und die Dokumentation und das dauert. Das was ich bisher habe ist mehr als bescheiden:

Code: Alles auswählen

import csv
reader = csv.reader (open("210019_-_09072009_20082010152451.CSV", "rb"))
for row in reader:
    print row
Es wird geoeffnet und in der "Shell" angezeigt. Jetzt überlege ich gerade wies weitergeht. Vllt mit einer Schleife über alle Zeilen gehen und ersteinmal alles in einem Array speichern....und dann beschneiden.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Wie wäre es mit Dictionaries?
BlackJack

@Engl.Blackmore: Das was Du mit Arrays wahrscheinlich meinst, heisst in Python Liste (`list`). Die Funktion (eigentlich der Typ) mit dem Namen `list()` nimmt ein beliebiges iterierbares Objekt entgegen, und gibt eine Liste mit allen Elementen aus dem Iterator zurück. Iterierbar ist alles was in Verbindung mit der `iter()`-Funktion einen Iterator zurück gibt bzw. alles was man nach dem ``in`` in einer ``for``-Schleife verwenden kann. Denn was dort steht muss iterierbar sein, um darüber in einer Schleife iterieren zu können. Irgendwie logisch, gell.

Du solltest strukturell als nächstes am besten Funktionen in Dein Programm einführen und für die ganzen Teilprobleme solche schreiben. Wenn Du so eine Datei nämlich in eine Liste eingelesen hast, könntest Du eine Funktion schreiben, die aus daraus die nötigen (Teil)Daten liefert. Dann eine die für den ersten Teil die Daten in die richtige Form bringt (das Transponieren) und so weiter.

@gkuhl: Dictionaries sehe ich hier im Moment (noch) nicht. Insbesondere weil die Reihenfolge ja nicht erhalten bleiben muss, und wenn ich nichts übersehen habe operiert man hier hauptsächlich auf gleichförmigen "Tabellen" und weniger auf Schlüssel/Wert-Abbildungen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vielleicht als kleiner Hinweis zum Transponieren:

Code: Alles auswählen

>>> m = [[1,2,3],
...      [4,5,6],
...      [7,8,9]]
>>> zip(*m)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Das Leben ist wie ein Tennisball.
fon77
User
Beiträge: 17
Registriert: Freitag 10. April 2009, 20:58

Wenn's schrecklich schnell gehen soll würde ich eher dazu raten, dass Ganze in Excel etc. per Makro zu machen. Den Teil mit Transponieren und löschen der Spalten kannst Du ja einfach aufnehmen und musst dann nur noch was drumherum bauen, dass Deine 400 Dateien nacheinander öffnet und das Makro drauf anwendet.
problembär

@Engl.Blackmore: Ich kann mit Deiner Aufgabe immer noch nicht viel anfangen: Auf Zeilen in der Ausgangsdatei wie "Mit freundlichen Grüßen" einzugehen, habe ich keinen Bock.

Dennoch: Das folgende Skript (Python 2.4!) nimmt alle Dateien im Verzeichnis, die auf ".CSV" enden, durchsucht die jeweilige Datei nach Zeilen, die nur aus "Schlüssel;Wert"-Paaren zu bestehen scheinen und schreibt eine entsprechende Datei mit der Endung ".OUT", in der alle "Schlüssel" durch Semikolons getrennt in der ersten Zeile und alle "Werte" (entsprechend getrennt) in der zweiten Zeile stehen, in dasselbe Verzeichnis (in dem auch das Skript sein muß).
Auf Zeilenendungen (verschieden bei Linux (hier) / Windows (bei Dir)) habe ich auch nicht geachtet, sondern das "os.linesep" überlassen.
Keine Ahnung, ob Du so ein Skript brauchen kannst. Deine Verantwortung.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os
import glob

sufin = "CSV"
sufout = "OUT"
separator = ";"

def readfile(fname):
    fh = file(fname , "r")
    a = fh.readlines()
    fh.close()
    return a

def writefile(fname, outlist):
    fh = file(fname , "w")
    for i in outlist:
        if not i.endswith(os.linesep):
            i += os.linesep
        fh.write(i)
    fh.close()

a = glob.glob("*." + sufin)
for i in range(len(a)):
    a[i] = a[i][0:len(a[i]) - 4]

for i in a:
    b = readfile(i + "." + sufin)
    order = []
    vals = {}
    for u in range(len(b)):
        b[u] = b[u].rstrip(os.linesep)
        c = b[u].split(separator)
        if len(c) != 2:
            continue
        order.append(c[0])
        vals[c[0]] = c[1]
    result = [separator.join(order)]
    secline = ""
    for u in order:
        secline += vals[u]
        secline += separator
    secline.rstrip(separator)
    result.append(secline)
    print "Writing: " + i + "." + sufout + "."
    writefile(i + "." + sufout, result)
Gruß
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Engl.Blackmore:

Der Ansatz ist doch ok. :-) Jetzt noch mit der Transformation von ExDu kombinieren und die Hälfe ist geschafft:

Code: Alles auswählen

import csv
reader = csv.reader(open('mein_csv.csv','r'))
original = []
for r in reader:
    original.append(r)
transformiert = zip(*original)
Jetzt musst du nur noch "transformiert" auf die Platte speichern (am besten mittels csv.writer) und der Teil ist fertig.
Wie man alls .csv-Dateien in einem Verzeichnis "greift zeigt z.B. das Skript von problembär.

Gruß, noisefloor
Engl.Blackmore
User
Beiträge: 5
Registriert: Samstag 4. September 2010, 18:43

Vom Herzen danke für eure Hilfe. Ich hab schon 5 Tafeln Schokolade reingekübelt, 4 Tutorials fast durchgekaut & war gerade dabei eine Entschuldigungsmail zu schreiben aber das könnte die Wende sein....
EyDu hat geschrieben:Vielleicht als kleiner Hinweis zum Transponieren:

Code: Alles auswählen

>>> m = [[1,2,3],
...      [4,5,6],
...      [7,8,9]]
>>> zip(*m)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Danke
fon77 hat geschrieben:Wenn's schrecklich schnell gehen soll würde ich eher dazu raten, dass Ganze in Excel etc. per Makro zu machen. Den Teil mit Transponieren und löschen der Spalten kannst Du ja einfach aufnehmen und musst dann nur noch was drumherum bauen, dass Deine 400 Dateien nacheinander öffnet und das Makro drauf anwendet.
Auch eine gute Idee aber wer schon "Probleme" mit einer "leichten" Skriptsprache (?) wie Python hat der wird sicherlich auch in der Makroprogrammierung nicht weit kommen. Auch wenn man wenn, wie du schon meintest, Anweisungen "aufnehmen" kann. Das Umdenken würde leider zuviel Zeit kosten.
problembär hat geschrieben:@Engl.Blackmore: Ich kann mit Deiner Aufgabe immer noch nicht viel anfangen: Auf Zeilen in der Ausgangsdatei wie "Mit freundlichen Grüßen" einzugehen, habe ich keinen Bock.
Ich weiß nicht was du genau meinst aber du hast ein Recht darauf kein Bock zu haben. Jedenfalls muss derartiges auch nicht beachtet werden, sowas wird aussortiert und wird nicht benötigt.
problembär hat geschrieben: Dennoch: Das folgende Skript (Python 2.4!) nimmt alle Dateien im Verzeichnis, die auf ".CSV" enden, durchsucht die jeweilige Datei nach Zeilen, die nur aus "Schlüssel;Wert"-Paaren zu bestehen scheinen und schreibt eine entsprechende Datei mit der Endung ".OUT", in der alle "Schlüssel" durch Semikolons getrennt in der ersten Zeile und alle "Werte" (entsprechend getrennt) in der zweiten Zeile stehen, in dasselbe Verzeichnis (in dem auch das Skript sein muß).
Auf Zeilenendungen (verschieden bei Linux (hier) / Windows (bei Dir)) habe ich auch nicht geachtet, sondern das "os.linesep" überlassen.
Keine Ahnung, ob Du so ein Skript brauchen kannst. Deine Verantwortung.
Dafür kann ich dir nicht genug danken. Ich versuchs irgendwie zusammenzuschustern und schaus mir an.
noisefloor hat geschrieben:Hallo,
@Engl.Blackmore: Der Ansatz ist doch ok. :-) Jetzt noch mit der Transformation von ExDu kombinieren und die Hälfe ist geschafft.
Jetzt musst du nur noch "transformiert" auf die Platte speichern (am besten mittels csv.writer) und der Teil ist fertig.
Gruß, noisefloor
Danke dir. Das könnte jetzt doch noch was werden. Die Nacht wird sicherlich lang.

Gruß
problembär

Engl.Blackmore hat geschrieben:
problembär hat geschrieben:@Engl.Blackmore: Ich kann mit Deiner Aufgabe immer noch nicht viel anfangen: Auf Zeilen in der Ausgangsdatei wie "Mit freundlichen Grüßen" einzugehen, habe ich keinen Bock.
Ich weiß nicht was du genau meinst
Z.B. in der Datei "...\Dateien\01. Testdatensätze\210110.CSV" steht:
HRT;
TO;0
TS;1,2
Decelartion capacity;3,96
Acceleration capacity;-4,52

16.08.2010;
Aufzeichnungsdauer ca. 2 Stunden. Einzelne Störungen. Durchgehend Sinusrhythmus. Minimale HF 63 /min, maximale HF 101/min. Vereinzelt supraventrikuläre und ventrikuläre Extrasystolen, keine höhergradige Herzrhythmusstörungen. Es würden keine Bradykardien und keine Pausen über 2 Sekunden Lang detektiert. ;
Lown Klasse 1 . Herzfrequenzentsprechende ST-Strecken-Veränderungen keine Ischämiezeichen. ;

Mit freundlichen Grüßen;


Frau X Y;
Solche von Hand eingefügten Bemerkungen samt "Unterschrift" sind für eine automatische Verarbeitung natürlich sehr hinderlich, weil das Skript sie von den "echten" Daten irgendwie trennen müßte, wofür es Trennkriterien bräuchte. Wenn man die Trennkriterien hat, kann man es programmieren. Hab' ich bei meinem Skriptvorschlag oben aber wie gesagt nicht gemacht (worauf ich ja hinweisen muß).

Gruß
Antworten