Laden...

Brauche Hilfe beim Parsen (Aufbau des Programms)

Erstellt von dragi vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.411 Views
D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren
Brauche Hilfe beim Parsen (Aufbau des Programms)

Hallo,

ich muß mehrere Informationen aus Listen auslesen und Gegeneinander vergleichen. Dabei möchte ich um Tips zum Aufbau bitte. Damit meine ich keinen Code sondern eher die Architektur bzw. wie ich das am besten angehe.

Aufbau Liste 1:


object bla
 Wert1=a
 Wert2=b
 Wert3=c
 ...
end

object blabla
 Wert11=d
 Wert12=t
 ...
end

Aufbau Liste 2:


Wert1=a
Wert2=b
Wert3=c
...

In den meisten fällen finden sich die Werte aus der einer Liste auch in der anderen Liste. Die Bezeihnung der Werte und die Werte selber sind immer unterschiedlich, je nachdem welche 2 Listen man vergleicht. Werte die nur in einer Liste vorkommen sind dabei egal und fallen raus.
Wie würdet ihr das lösen? Irgendwie muß ich ja bei der ersten Liste nach dem Wort object suchen und dann die Werte bis end in einer Liste speichern. Dann das nächste object und end suchen und die Werte speichern und diese ganzen Werte zu, schluß zusammen führen. Die zweite Liste würde ich so auslesen:

Die Liste in ein Stringarray einlesen und in einer Schleife die Zeilen durchgehen. In jede Zeile Buchsteba für Buchstabe in einen String einlesen und wenn das Gleichheitszeichen ereeicht wurde diesen String abspeichern. Dann habe ich schonmal die Wertebezeichnung. Dann weiterlesen bis zum Zeilenende, dann habe ich den eigentlichen Wert.

Ist das zu kompliziert? Bin für jede Hilfe sehr dankbar

Gruß

Dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

Ist das zu kompliziert?

Ja!

Besser ist zeilenweises Einlesen und die Zeilen dann mit Regex.Match/Match.Groups (Forumssuche) untersuchen und aufteilen. Das Aufteilen geht alternativ mit String.Split.

Aus zwei Listen nur die Werte herauszusuchen geht, die in beiden enthalten sind, geht am besten mit Hashtables/Dictionarys. Siehe dazu (analog): Arrays abgleichen

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Du meinst ich soll mit Regex in jeder Zeile das Gleichheitszeichen suchen? Und dann an der Stelle den String teilen? Ich kenne mich noch nicht mit Regex aus, aber da hier soviel darüber steht sollte es dann kein Problem sein.

Aber eine Frage habe ich noch:

Nun habe ich noch ein anderes Konstrukt das ich parsen muß:


object ObjectName :Typ
  Wert=1
  Wert=2
  ...
end

Hier muß ich den Objectnamen, den Typ, den Wertnamen und dessen eigentlichen Wert haben. Ich habe keine Idee wie ich da vorghehen soll? Die Werte können dabei länger als eine Zeile sein!

Gruß

dragi

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

So, das parsen des IniFiles mit Regex habe ich hinbekommen. Ist einfach genial damit!!! Aber zu meinem zweiten problem finde ich keinen Ansatz 🙁

Gruß

dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

Aber zu meinem zweiten problem finde ich keinen Ansatz

ich habe doch oben schon einen Ansatz beschrieben. Oder meinst du was anderes?

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Auch mit regulären ausdrücken ist mir nicht klar wie ich so einen object end Block auslesen soll. Ich suche nach Object und dann nach dem ":". Dazwischen befidnet sich der Objektname. Hinter dem ":" finde ich den Objekttyp. Und in den Zeilen bis zum END befinden sich die Werte. So ein Wert kann aber auch über 2 Zeilen oder mehr gehen.


object MeinObjekt :TEnum
  Wert1: Ich bin ein Wert
  Wert2: Ich bin natürlich
auch ein Wert
  Wert3: Ich bin der dritte Wert
end

Da weiß ich nicht weiter...

Gruß

Dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

der erste Teil ist einfach:

@"object\s+(?<name>\w+)\s*:\s*(?<type>\w+)"

Bei dem zweiten Teil ist die Frage, woran man erkenn, ob ein neuer Wert beginnt. Steht da wirklich "Wert" als fester Text?

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Hallo,

war das ganze WE weg, deshalb kann ich erst jetzt wieder Antworten.
Nein, "Wert" war nur zur Veranschaulichung. Es steht irgendetwas als Wertname vor dem Gleichheitszeichen und irgendein Wert hinter dem Gleichheitszeichen. Und es ist nicht bekannt wie der Wert benannt ist, das kann sich von Liste zu Liste ändern.

Gruß

dragi

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Habe mit deinem RegEx String schonmal versucht die erste zeile zu parsen aber er findet den namen nicht der zum Beispiel so lautet: Security_JavaDomain#006
Wenn ich alles bis auf Security lösche findet er Security...nur nicht den gesamten Namen.

Gruß

Dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

zum ersten Beitrag:
tja, dann hast du ein Problem. Dann kannst du bestimmte Konstellationen nicht unterscheiden. Damit kannst du keinen Regex dafür schreiben.

Du musst dir also irgendwelche Einschränkungen einfallen lassen, z.B. dass Werte keine Gleichheitszeichen enthalten dürfen und Wertnamen keinen Leerzeichen. Dann könnte es gehen.

zum zweiten Beitrag:
Dann musst du statt \w die erlaubten Zeichen angeben. \w erlaubt ja nur Wortzeichen, also Buchstaben. Erlaubte Zeichen gibt man in eckigen Klammern an. Am besten du guckst mal in die Hilfe.

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Hallo herbivore,

danke für deine Antworten! Ich habe festgestellt das Mehrzeilige Werte immer in Klammern stehen. Somit kann ich mich dann ander Klammer orientieren beim auslesen.

Im Moment speichere ich jeden Object End Konstrukt aus der Liste in einem Objekt das so aussieht:


class StFctObject
    {
        private string ObjName; // Name des Objektes
        private string ObjType;  // Typ des Objektes

        //Liste mit den Werten und deren Bezeichnung
        List<StFctValueObject> StFctValueObjList = new List<StFctValueObject>();

        public void SetObjName(string ObjNameToSet)
        {
            ObjName = ObjNameToSet;
        }

        public string GetObjName()
        {
            return ObjName;
        }

        public void SetObjType(string ObjTypeToSet)
        {
            ObjType = ObjTypeToSet;
        }

        public string GetObjType()
        {
            return ObjType;
        }

        public void SetStFctValueObject(string NameToSet, string ValueToSet)
        {
            StFctValueObject MyStFctValueObject = new StFctValueObject();
            MyStFctValueObject.SetName(NameToSet);
            MyStFctValueObject.SetValue(ValueToSet);
            StFctValueObjList.Add(MyStFctValueObject);
        }
    }

    class StFctValueObject  //Hier werden die eigentlichen Werte gespeichert
    {
        private string Name;   //Bezeichnung des Wertes
        private string Value;   //Eigentlicher Wert

        public void SetName(string NameToSet)
        {
            Name = NameToSet;
        }

        public string GetName()
        {
            return Name;
        }

        public void SetValue(string ValueToSet)
        {
            Value = ValueToSet;
        }

        public string GetValue()
        {
            return Value;
        }

    }

Nun habe ich in einer Liste aber auch ein Verschachteltes Object gefunden:


object Irgendwas: Typ1
  object Machwas: Typ2
     Wert1 = 1
  end
  object Machauchwas: Typ2
     Wert2 = 2
  end
end

Das kriege ich mit meinem Object nciht abgebildet und wollte Fragen ob du oder jemand anders einen Tip hat wie ich so ein Konstrukt am besten speicher?

Vielen Dank

dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

du brauchst in StFctObject eben nicht nur eine List<StFctValueObject>, sondern auch eine List<StFctObject>.

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

OK, ich habe verstanden das ich eine Liste brauche die Unterobjekte aufnimmt die auch vom Typ StFctObj sind. Aber wie greife ich auf diese wieder zu? Wie setze ich den Namen und den Typ eines Unterobjektes? Ich muß den zugriff sicher selbst programmieren aber irgendwie ist das ziemlich kompliziert :S

dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

nö, so kompliziert ist das nicht, wenn man es rekursiv macht.

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Hast Recht, der Aufbau meiner Objektklasse ist abgeschlossen und das Prinzip ist mir auch klar. Wobei ich jetzt aber wirklich Probleme habe ist das eigentliche parsen. Ich möchte hier auch expliziet fragen ob mir das jemand einen Tip als code oder pseudocode geben könnte:

Mit regex suche ich nach der Zeile

 objekt name: typ

aber wie man nun codetechnisch rausfindet ob danach ein Unterobjekt folgt und wieviele ist mir wirklich ein Rätsel. Ich dachte ich suche zum nächsten END, habe dann die Anzehl der Zeilen die das Objekt einnimmt, weiß doch aber gar nciht zu welchem Objekt das End gehört. Ich stehe dann evtl. Am Ende eines Unterobjektes aber es kommen noch weitere Unterobjekte. Hat jemend einen Ansatz dafür?

Hier nochmal ein Auschnitt was geparst werden muß:



object name: type
  Wertname = Wert
  Wertname = Wert
  ...
end


object name: type
  object name:type
    Wertname = Wert
    Wertname = Wert
    ...
  end
  object name: type
    Wertname = Wert
    Wertname = Wert
    ...
  end
end


Vielen Dank

Dragi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

du kannst mit Regex nicht sicherstellen, das Klammern (begin/end) paarig gefunden/berücksichtigt werden. Ich würde es so machen, wie ich in Parser für BBcode? beschrieben habe.

herbivore

D
dragi Themenstarter:in
368 Beiträge seit 2005
vor 18 Jahren

Ok, hab mir das angesehen und versucht zu verstehe... noch nicht ganz erfolgreich 😉
ABer kannst du oder jemnad hier mir ein kleines Beispiel geben wie man so etwas rukursiv parst. Ich meine Pseudocode damit ich mich erstmal mit Rekusrion beschäftigen kann. Ich bin hier der einzige der programmieren kann, von daher stehe ich hier alleine auf weiter Flur und kann mir nur Hilfe aus Foren holen.

Danke

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo dragi,

mein Vorschlag in Parser für BBcode? kommt ja ohne Rekursion aus. Eigentlich finde ich den auch ganz einfach zu verstehen. Der Algorithmus ist zwar nicht in Pseudocode aber in Prosa genau beschrieben. Wüsste erstmal nicht, was ich noch schreiben könnte. Was verstehst du denn nicht? Welche konkreten Fragen hast du?

herbivore