Entwickler-Ecke
Sonstiges (.NET) - Parsen einer .txt Datei mit nicht angeführten Tokens
MCPC10 - Do 23.02.17 22:15
Titel: Parsen einer .txt Datei mit nicht angeführten Tokens
Guten Tag liebes Forum,
Ich bin gerade dabei mit einem Freund ein kleines Programm zu schreiben, dass eine .txt des Spiel Hearts of Iron 4 ausließt (C#) und anzeigt (in verschieden Textboxen).
Leider hat keiner von uns eine Ahnung wie man solch eine .txt parst, um den Inhalt zu trennen, denn es wird kein normales Format wie JSON benutzt.
Hier ein Ausschnitt der txt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| focus = { id = GER_west_wall icon = GFX_goal_generic_construct_military prerequisite = { focus = GER_autobahn } x = 0 y = 1 cost = 10 ai_will_do = { factor = 8 } completion_reward = { #add_ideas = todt custom_effect_tooltip = available_political_advisor show_ideas_tooltip = todt 50 = { if = { limit = { is_controlled_by = ROOT } custom_effect_tooltip = GER_west_wall_forts hidden_effect = { add_building_construction = { type = bunker level = 3 province = 11640 instant_build = yes } add_building_construction = { type = bunker level = 3 province = 6712 instant_build = yes } add_building_construction = { type = bunker level = 3 province = 6542 instant_build = yes } add_building_construction = { type = bunker level = 3 province = 3530 instant_build = yes } } } } if = { limit = { 42 = { is_demilitarized_zone = yes } } custom_effect_tooltip = GER_west_wall_tt 42 = { custom_effect_tooltip = GER_west_wall_forts } } hidden_effect = { 42 = { if = { limit = { is_controlled_by = ROOT } add_building_construction = { type = bunker level = 3 province = 3558 instant_build = yes } add_building_construction = { type = bunker level = 3 province = 563 instant_build = yes } add_building_construction = { type = bunker level = 3 province = 11531 instant_build = yes } add_building_construction = { type = bunker level = 3 province = 9575 instant_build = yes } } } } } } |
Ich hoffe ihr könnt uns helfen das Problem zu lösen.
MfG
Mike
Stephan
Ralf Jansen - Fr 24.02.17 12:53
Jo. Und dann mit ANTLR aus der BNF den Parser generieren. Dann haben wir ja für unseren Anfänger die Basics durch :roll:
@MCPC10 : Was willst du dann anschließend mit der Interpretation machen. Dass Format ist ja erstmal auch nur ein geschachteltes Key-Value Ding. Wenn du darüber hinaus gar keine Vorstellungs hast was die einzelnen Key und Values bedeuten sehe ich keinen Vorteil eines Tool gegenüber direktem Bearbeiten der Datei. Beispiel ein Key der "if" heißt oder einfach nur eine Zahl ist meint bestimmt nicht nur zufällig diesen Text.
MCPC10 - Fr 24.02.17 17:02
Also wir haben derzeit vor, dass man das in einer anschaulichen Darstellung angezeigt bekommt (ohne Klammern, etc), zum bearbeiten und dann später wieder in das Spiele Format zurück zu "konvertieren".
Th69 - Fr 24.02.17 18:46
Hast du denn schon eine Idee, wie die interne Datenstruktur dafür dann aussehen soll?
MCPC10 - So 26.02.17 16:53
Nicht so direkt :), kenn mich mit sowas noch nicht aus.
Th69 - So 26.02.17 18:02
Hast du denn schon mal die Datenstrukturen List<T> und Dictionary<K, V> benutzt?
MCPC10 - So 26.02.17 18:15
List<> habe ich schon mal benutzt, aber im Zusammenhang mit DirectX (Joysticks in ShrapDX).
MCPC10 - Sa 04.03.17 16:51
Mach ich
Th69 - So 05.03.17 15:17
Aus Lust und Laune habe ich gerade einen Parser dafür implementiert (mit VS 2015 + .NET 4).
Es gibt zwei Projekte in der ConfigParser-Solution:
- ConfigParser als Klassenbibliothek
- TestApp als Konsolenprogramm, welche die Testdatei parst und wieder ausgibt
Als Anfänger wirst du wahrscheinlich nicht durch den gesamten Parser-Code durchsteigen, aber zumindestens den Code der TestApp solltest du verstehen können (wenn nicht, einfach nachfragen).
PS: Intern habe ich kein Dictionary benutzt, sondern eine List, um die Reihenfolge der Einträge nicht zu ändern.
MCPC10 - So 05.03.17 16:39
Oh, danke werden uns das mal genauer anschauen :)
stuffi3000 - So 05.03.17 17:22
@Th69
Erstmal ein riesengroßes Dankeschön für deine Mühe! Das ist echt ne super Hilfe :)
Das was oben im Thread steht ist aber nur ein Ausschnitt der Datei. Wenn wir jetzt versuchen die ganze Datei zu parsen funktioniert es nicht, weil meiner Meinung nach gewisse Sachen nicht in der list drinstehen. Wie können wir denn selbst Sachen da reinschreiben? Oder soll ich mal die ganze Datei hier anhängen?
Th69 - So 05.03.17 17:59
Ich bin mir nicht sicher, ob das rechtlich in Ordnung wäre, die ganze Config-Datei des Spiels hier reinzustellen.
Erhaltet ihr eine Exception und wenn ja welche (bzw. dann kannst du ja den betreffenden Ausschnitt mal posten - deswegen habe ich extra die Zeilennummer bei der ParserException mit angegeben)?
PS: Kennt ihr euch denn schon mit dem Debugger aus?
PPS: Du kannst mir aber eine Private Nachricht (PN) schicken, und dort die Config-Datei als Anhang einfügen - dann schaue ich mir das mal selber an.
Th69 - Fr 10.03.17 12:42
So, jetzt wird die ganze Datei korrekt eingelesen - im Anhang ist der geänderte Code dafür.
Es gab noch ein paar weitere Anpassungen, die erst bei der großen Datei auffielen (s. "TestApp/ToDo.txt").
Im TestApp/bin/Debug-Ordner befindet sich auch die daraus neu geschriebene Datei "Output.txt".
Ich hoffe, ihr könnt jetzt mit eurem Projekt weitermachen!?! Es gibt sicherlich noch einige Änderungen zu machen, wenn ihr die Daten auch editieren wollt.
Falls noch Fragen auftauchen, einfach hier schreiben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!