Tabelle umbauen

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
docsnyder
User
Beiträge: 7
Registriert: Freitag 12. Dezember 2003, 07:56
Wohnort: Linden/Hess.

Hallo Forum,

ich bin neu hier, beschaeftige mich erst seit kurzem etwas mehr mit Python.
Konkret habe ich folgende Frage. Es handelt sich um eine Tabelle, die aus einer Lotus Notes Anwendung erzeugt wird. Sie liegt jetzt als Textdatei vor, die ich noch wie folgt umbauen will:

Stand jetzt:
A1;23456;2001;Budget;Umsatz
A1;23456;2003;Budget;Umsatz
A1;23456;2002;Budget;Umsatz
A2;23456;2001;Budget;Umsatz
A2;23456;2003;Budget;Umsatz
A1;55555;2001;Budget;Umsatz
A1;55555;2002;Budget;Umsatz
....
Jetzt sollen die alle (Jahres)werte für Budget und Umsatz in _1_ Zeile erscheinen, also

(noch nicht) Stand soll:
A1;23456;Budget(2001);Ums.(2001;Bud.(2002);Ums.(2002);Bud.(2003);Ums.(2003)
A2;23456;Budget(2001);Ums.(2001;0;0;Bud.(2003);Ums.(2003)
A1;23456;Budget(2001);Ums.(2001;Bud.(2002);Ums.(2002);0;0
...

Es geht wahrscheinlich einfacher mit einer Tab. kalkulation, ich will es aber mit einem Python-Skript lösen. Motto: eine Datei oben rein, Ergebnis kommt fix+fertig raus.

Ich habe probiert, die Datei mit readlines einzulesen, und den Abgleich zeilenweise zu machen, aber da kommt nix gescheites raus.

Hat jemand hier schonmal sowas gemacht, oder einen Tip?

Gruss
Andreas
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!

Weil Freitag ist und ich außerdem heute gute Nachrichten vom Finanzamt bekam :D, gibts 'ne fast fertige Lösung. Fehlt nur noch das Datei-Handling.
Wie so häufig, ist der Datentyp Dictionary wohl die beste Wahl. Fall noch nicht geschehen, unbedingt mit dem Datentyp vertraut machen! Im Folgenden nenne ich mal die Kombination aus den ersten beiden Werten eine "Filiale". Wird ja sowas in der Richtung sein.

Code: Alles auswählen

zeilen = ["A1;23456;2001;Budget;Umsatz",
"A1;23456;2003;Budget;Umsatz",
"A1;23456;2002;Budget;Umsatz",
"A2;23456;2001;Budget;Umsatz",
"A2;23456;2003;Budget;Umsatz",
"A1;55555;2001;Budget;Umsatz",
"A1;55555;2002;Budget;Umsatz"]

dict1 = {}
dict2 = {}
for zeile in zeilen:
    felder = zeile.split(";")
    dict1[ ";".join(felder[0:2]) ] = None
    dict2[ ";".join(felder[0:3]) ] = ";".join(felder[-2:])
    
zeilen = []
for key in dict1.keys():   # Schleife über alle Filialen
    neueZeile = key+";"
    for j in range(2001,2004):
        neueZeile += dict2.get(key+";"+str(j),"0;0") + ";"
    zeilen.append(neueZeile[:-1])
    
for zeile in zeilen:
    print zeile

Ausgabe:
A1;23456;Budget;Umsatz;Budget;Umsatz;Budget;Umsatz
A2;23456;Budget;Umsatz;0;0;Budget;Umsatz
A1;55555;Budget;Umsatz;Budget;Umsatz;0;0

Kurze Erläuterung:
dict1 sammelt alle Filialen (also z.B. "A1;23456"), damit wir überhaupt wissen, welche es gibt. Value ist None, weil uninteressant.
dict2 sammelt alle Filiale-Jahres-Kombinationen (also z.B. "A1;23456;2002") mit Budget/Umsatz als Value.
Danach kommen 2 verschachtelte for-Schleifen, die äußere über die Filialen und die innere über die Jahre. Gibt es zu einer Filiale und einem Jahr einen Eintrag im 2. Dictionary, wird die neue Zeile um den entsprechenden Value ergänzt, ansonsten mit "0;0".

Der geschicktere (vielleicht von Lehrern/Dozenten erwartete), aber nicht unbedingt lesbarere Ansatz wäre es, die Dictionaries zu verschachteln. Jeder Filial-Value wäre wieder ein Dictionary mit den Jahren als Schlüssel.

Ok, vielleicht hat ja jemand noch einen gänzlich anderen Ansatz.
Jan
docsnyder
User
Beiträge: 7
Registriert: Freitag 12. Dezember 2003, 07:56
Wohnort: Linden/Hess.

Hallo
und danke. Das funktioniert. Einewandfrei. Also steht Beschaeftigung mit Dictionaries an.
Und noch viele gute Nachrichten vom Finanzamt :-)
Gruss
Andreas
Antworten