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
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
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
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
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
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
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
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
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
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
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
Hallo dragi,
du brauchst in StFctObject eben nicht nur eine List<StFctValueObject>, sondern auch eine List<StFctObject>.
herbivore
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
Hallo dragi,
nö, so kompliziert ist das nicht, wenn man es rekursiv macht.
herbivore
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
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
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
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