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
Tabelle umbauen
Hallo!
Weil Freitag ist und ich außerdem heute gute Nachrichten vom Finanzamt bekam , 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.
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
Weil Freitag ist und ich außerdem heute gute Nachrichten vom Finanzamt bekam , 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