Autor Beitrag
MCPC10
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

Win 10, Win Server 2016
C# (VS 2015, VS2017, VS2019), Assembler (Atmel Studio 7.0)
BeitragVerfasst: Do 23.02.17 22:15 
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:
ausblenden volle Höhe 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
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 24.02.17 12:31 
Hallo,

das scheint ein Spezialformat (so zwischen JSON und INI) zu sein.
Aber als EBNF ja recht einfach darzustellen:
ausblenden Quelltext
1:
2:
3:
4:
5:
S = { T }
T = Key "=" Value
Key = Id
Value = Id | "{" S "}"
Id = <alphanumeric>

Dies müßte mit einem einfachen Rekursiver Abstieg (Recursive Descent)-Parser recht einfach umzusetzen sein.
Mein Parser für mathematische Formeln funktioniert nach einem ähnlichen Muster.

Und mit meinem Extended Backus-Naur-Form (EBNF)-Parser könntest du nachprüfen, ob die obige EBNF-Definition paßt (müßtest dann natürlich "<alphanumeric>" noch passend definieren).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 24.02.17 13:09 
Naja, Parsen ist nun mal nichts für Programmieranfänger.
Aber wenn man sich ein bißchen einliest, ist es gar nicht so schwer, s. z.B. Introduction to Recursive Descent Parsers with C#
Ich will nur verhindern, daß jemand einfach mit Frickelcode versucht solche Probleme anzugehen.
MCPC10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

Win 10, Win Server 2016
C# (VS 2015, VS2017, VS2019), Assembler (Atmel Studio 7.0)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 24.02.17 18:46 
Hast du denn schon eine Idee, wie die interne Datenstruktur dafür dann aussehen soll?
MCPC10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

Win 10, Win Server 2016
C# (VS 2015, VS2017, VS2019), Assembler (Atmel Studio 7.0)
BeitragVerfasst: So 26.02.17 16:53 
Nicht so direkt :), kenn mich mit sowas noch nicht aus.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 26.02.17 18:02 
Hast du denn schon mal die Datenstrukturen List<T> und Dictionary<K, V> benutzt?
MCPC10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

Win 10, Win Server 2016
C# (VS 2015, VS2017, VS2019), Assembler (Atmel Studio 7.0)
BeitragVerfasst: So 26.02.17 18:15 
List<> habe ich schon mal benutzt, aber im Zusammenhang mit DirectX (Joysticks in ShrapDX).
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 26.02.17 19:28 
Dann schau dir mal die Dictionary<TKey, TValue>-Klasse an und überlege dir, ob und wie du damit die Daten der Textdatei speichern könntest.
MCPC10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

Win 10, Win Server 2016
C# (VS 2015, VS2017, VS2019), Assembler (Atmel Studio 7.0)
BeitragVerfasst: Sa 04.03.17 16:51 
Mach ich
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Th69 am So 05.03.17 16:53, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: stuffi3000
MCPC10 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

Win 10, Win Server 2016
C# (VS 2015, VS2017, VS2019), Assembler (Atmel Studio 7.0)
BeitragVerfasst: So 05.03.17 16:39 
Oh, danke werden uns das mal genauer anschauen :)
stuffi3000
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: MCPC10, stuffi3000