BlackJack hat geschrieben:Mein Kommentar sollte sagen: Kein Mensch, ausser Dir wird verstehen was die Eingabedaten bedeuten und was dieser Code daraus macht. Das ist einfach nicht wirklich verständlich.
Ich bin nicht sicher, ob ich es in Worten verständlicher ausdrücken kann - mir fehlt hier übliches Fachvokabular, was dann ja auch wieder Verwirrung stiften kann.
nkoehring hat geschrieben:
Hmm... also ich versuchs nochmal, in der Hoffnung, dass du den guten Willen erkennst und ihn auch bei dir auspraegst!
Der gute Wille ist schon da, er hilft nur nicht, weil ihm so gut wie keinerlei Fähigkeiten beistehen ... Immerhin hab ich geschafft, den Code bei pocoo unterzubringen, für Nicht-Fachleute ist das schon schwierig

. Ich habe das, was ich machen möchte, mit der "langen", zu ersetzenden Variante hinbekommen, und angenommen, es würde verdeutlichen, worauf ich hinausmöchte.
Aber nochmal in Langform:
Ich habe eine Textdatei, die Daten in der Form
- Hauptgruppe1
-- Teilgruppe11 [12]
-- Teilgruppe12 [75]
--- Untergruppe121 [2]
- Hauptgruppe2 [18]
enthält (im Code etwas länger, in den Zeilen 85 - 90).
Es gibt also drei "hierarchische Ebenen", und in einer Gruppe von Zeilen kann die hierarchische Ebene jeweils um eins zunehmen oder beliebig weit wieder abnehmen, bis auf die erste Ebene.
Was ich also schon mal nicht habe, sind die = zwischen den eingeklammerten Werten und den Begriffen, die ich als Schlüssel haben will

. Aber das würde ich vermutlich hinbekommen.
Mein Problem ist folgendes:
Ich habe Hauptgruppen, die Teilgruppen enthalten, die Untergruppen enthalten. Ich möchte daraus ein Dict machen, das die Hauptgruppen als "erste Ebene" enthält, alle gleichwertig nebeneinander jeweils als eigene Dictionaries.
In diesen Dictionaries sollen sich dann die jeweiligen Teilgruppen als Dictionaries finden, und
in den Teilgruppen-Dictionaries sollen die Untergruppen als Dictionaries liegen.
Der "auskommentierte" Code macht das auch. Aber BlackJack hat mich so oft für Codewiederholugen angepflaumt, daß ich dachte, es kann so noch nicht bleiben

. Man müsste es doch "verallgemeinern" können...
Was ich bisher mache, ist also folgendes:
Ich nehme die Textzeilen, die den gewünschten Datenbereich enthält, und zerlege ihn in einzelne Zeilen. Die stehen zu dem Zeitpunkt noch alle in einer Liste, beispielsweise "Gruppen_Zeilenliste".
Der Teil "dictaufbau" (Zeilen 0 bis 21, in Zeile 92 aufgerufen) geht die Zeilen durch und sieht zuerst nach, ob ein "-" vorkommt (Zeilen 4-6). (Kommentarzeilen z.B. beginnen nicht mit "-".) Wenn eine Zeile also Datenzeile ist, wird bestimmt, welche "hierarchische Ebene" der darin stehende Begriff (derzeit ersetzt durch die Begriffe "Hauptgruppe" usw.) hat.
Ist die hierarchische Ebene der nächsten Zeile höher als die der vorigen, soll ein Dictionary innerhalb des zuvor angelegten erstellt werden. Deshalb merkt sich die "Schluesselliste", welche Schluessel diese jeweils angeben, und der neue Begriff wird angehängt. (Das handeln die Zeilen 7 - 9 ab.)
Ist die hierarchische Ebene der beiden Zeilen gleich, wird von der Schluesselliste der letzte Schlüssel (der jetzt nicht mehr gebraucht wird, weil in diesem Teildictionary keine Eingaben mehr gemacht werden sollen) "abgehängt" und dafür der neue Schlüssel angehängt. (Zeilen 11 - 14.)
Sinkt die hierarchische Ebene, werden entsprechend viele Schlüsselteile "abgehängt". (Zeilen 16 - 20)
Für das "Anhängen" selbst ist der Teil "dict_erweitern" zuständig (Zeilen 23 - 81).
Er nimmt (in den Zeilen 26 - 31) zuerst den Teil, der dann zu "Wahrsch" wird, ab, wenn der überhaupt vorhanden ist. Mit Sicherheit kann ich nur sagen, daß der Ausdruck, den ich vom vorigen trennen möchte, wenn überhaupt ganz hinten steht und in eckige Klammern eingeschlossen ist. Ich verwende daher split mit dem Trennzeichen "[", weil der Begriff, der davorsteht, eventuell Leerzeichen enthalten kann. Ich kann also nicht einfach nach Worten splitten. Auch nach Zahlen zu suchen geht nicht, weil "Wahrsch" auch aus Buchstaben bestehende Platzhalter sein können. Deshalb bin ich auf die Klammer verfallen, weil sie eindeutig ist.
In der Liste "Begriffsteile" habe ich damit zwei Teile, einen Begriff und einen Wert.
Mit dem Begriff, wie er zu Anfang ohne Ergänzung war, oder dem ersten Teil von zweien mache ich dann weiter.
In der "alten Version", die in den Zeilen 49 - 76 steht, habe ich die Begriffe der Reihe nach aus der Schlüsselliste abgerufen und als Schlüssel hinter dem Dictionary-Namen eingetragen. Das hat auch funktioniert; ich habe damit meine geschachtelten Dictionaries bekommen, in die ich (wenn vorhanden) dann den abgetrennten "Warhsch"-Wert eingetragen habe; anderfalls habe ich ein leeres Dict erzeugt.
Aber wie bekomme ich die Schlüssel in der richtigen Reihenfolge hinter den Dictionary-Namen, wenn ich sie nicht einzeln abrufen kann? Die Liste selbst geht nicht, weil sie ja durch Kommata abgetrennte Elemente enthält.
Ich habe vermutet, daß es über eine Zeichenkette machbar sein müsste, die den richtigen Aufbau hat. Als das nicht ging, waren meine eigenen Ideen alle und ich habe mir gesagt, ich finde vielleicht Hilfe bei besseren Programmierern...
Edit
Alternativ (ich probier es aber erst, wenn ich geschlafen habe) fällt mir bei Deinem Beispiel, nkoehring, ein: Ich könnte zuerst nach der größten Zahl von "-" suchen (also der innersten hierarchischen Ebene) und die jeweiligen Einträge in Dicts verwandeln und dann an den String der jeweils übergelagerten Ebene anhängen... Aber so spontan kommt mir das nicht sonderlich "elegant" vor, weil ich erstens die Liste dann mehrfach durchgehen muß und zweitens die ganzen inneren Dicts als Zeichenkette "mitschleife". Aber wie bekomme ich sie an die Stelle
in die anderen hinein, wenn ich sie einzeln erzeuge?