Zum Inhalt springen

Algo zum parsen folgender Kosntrukte:


Empfohlene Beiträge

Geschrieben

Hallo,

ich benötige dringend eure Hilfe! Ich muß eine bestimmte Art von Dokumenten parsen in denen Objekte beschreiben sind. Nun benötige ich einen Tip wie ich das algorithmisch am besten umsetzen kann.

Folgendes kommt in dem Dokument vor:

Einfaches Objekt:


object NAME: TYP

  Wert1 = 1

  Wert2 = 2

  ...

end

kompliziertes Objekt:

objekt NAME: TYP

  objekt NAME: TYP

    Wert1 = 1

    Wert2 = 2

    ...

  end

  objekt NAME: TYP

    Wert1 = 1

    Wert2 = 2

    ...

  end

end

Ich habe nun Klassen die ein Objekt und dessen unterobjekt repäsentieren aber wie soll ich das Dokument am besten durchgehen? Das Dokument gehe ich Zeile für Zeile durch bis ich einen Match auf object NAME: TYP habe. Nun weiß ich nicht wie ich weiter machen soll um die Unterobjekte, falls es welche gibt, zu bekommen. Und zu wissen wann ein Objekt mit unterobjekten zu ende ist. Zwischen den Objekten ist immer eine Leerzeile und ich denke das hilft mir. Aber ein Objekt kann aus N Unterobjekten bestehen...das ist mir echt zu hoch.

Habt ihr einen Tip für einen Algo?

Danke

Dragi

Geschrieben

Wie wäre es mit einem Stapel? Immer, wenn du eine object-Zeile findest, legst du ein neues Datenobjekt auf den Stapel. Bei den wert-Zeilen bearbeitest du das oberste Datenobjekt. Bei end-Zeilen nimmst du das oberste Objekt vom Stapel weg (und speicherst es, z.B. als Kindobjekt im nächstunteren Datenobjekt).

Geschrieben

Ich glaube ich kann dir einigermassen folgen, habe aber folgendes Problem:

Ich beginne mit einer for-Schleife. Von 0 bis Dokument Ende gehe ich die Zeilen durch. Nun finde ich das erste object NAME: TYP und arbeite mich ja dann in anderen funktionen durch das Objekt. Gehe ich nun zurück zu meiner Vorschleife geht die einen Schritt weiter und findet das objekt NAME: TYP des Unterobjektes das ich doch aber schon abgelegt habe. Das ist für mich total verwirrend. Hier mal mein angefangener Code:

C#


using System;

using System.Collections.Generic;

using System.Text;

using System.Text.RegularExpressions;

using System.IO;

using System.Windows.Forms;


namespace ParsIni

{

    class parseStructFct

    {

        public List<StFctObject> parseSTFct(string StFctPath)

        {

            List<StFctObject> StFctObjList = new List<StFctObject>();

            string[] sa = File.ReadAllLines(StFctPath); 

            Regex reg = new Regex(@"object\s+(?<name>[A-Za-z0-9 _ - # *]+)\s*:\s*(?<type>\w+)");


            for (int i = 0; i < sa.Length; i++)

            {

                if (reg.Match(sa[i]).Success)

                {

                    StFctObject TempStFctObj = new StFctObject();

                    TempStFctObj.SetObjName(reg.Match(sa[i]).Groups["name"].ToString());

                    TempStFctObj.SetObjType(reg.Match(sa[i]).Groups["type"].ToString());

                    if (sa[i] + 1 != "") // ???? keine Ahnung wie es weiter geht

                    {


                    }

                }

            }

            return StFctObjList;

        }

    }

}

Vielleicht denke ich einfach total verkehrt. Ist mien erster Parser und ich bin der einzige hier der programmiert, von daher steh ich hier allein auf weiter Flur... :(

Gruß

dragi

Geschrieben

Mit einer einfachen Schleife kannst du das nicht lösen, weil die Objekte eben nicht seriell abgelegt sind. Du brauchst irgendeine Lösung, die die hierarchische Struktur der Daten abbilden kann, entweder eine Rekursion oder den oben beschriebenen Stack.

Geschrieben

Ich verstehe was du meinst, hab von Rekursion nciht viel Ahnung.

Hast du oder jemand hier einen kleinen Ansatz zur Rekursion für mich? Also Pseudocode reicht da völlig.

Vielen Dank

Dragi

Geschrieben

Mach eine Funktion, die ein Objekt in eine lokale Variable einliest. Wenn diese Funktion auf eine object-Zeile trifft, ruft sie sich selbst auf, und fügt den Rückgabewert der Kind-Liste des Objekts hinzu. Am Ende der Funktion gibst du das lokale Objekt an den Aufrufer zurück.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...