Benutzer mit den meisten Antworten
C# Parserbau für Anfänger

Frage
-
Hallo liebe Community,
vor kurzem habe ich begonnen einen kleinen Parser in C# zu implementieren. Dabei versuche ich aus einen gegebenen Textdatei Daten zu lesen, dann zu speichern und daraus ein XML file zu generieren.
Die Quelldatei hat eine feste Struktur, in welcher sich die benötigten Daten, immer wieder wiederholen und in einen festen "Rahmen" eingebettet sind. In etwa so:
/begin Messung
variable durch messung generiert xyz
name der botschaft xyz
...
/end Messung
Ich habe jetzt begonnen das File zeilenweise zu lesen anhand von /begin Messung - /end Messung ein Datenpacket zu generieren. D.h. ich habe eine Klasse geschrieben mit meinen benötigten Daten und beim zeilenweisen lesen speichere ich meine Infos ab.
Da ich aber den Objekt Namen erst in Zeile 2 habe, nämlich die Botschaft, habe ich die Daten in einem Array zwischen gespeichert und generiere daraus dann mein Objekt, wenn alle Zeilen dieser Messung gelesen wurden.
Findet Ihr die Idee gut, erst das File zeilenweise zu lesen. Danach beim Auffinden von /beginn Messung ein Array zu füllen. Bei / end Messung ein Objekt zu erzeugen und es mit den gespeicherten Daten zu befüllen.
Gibt es eine bessere Möglichkeit Daten sinnvoll abzuspeichern?
Grüß, Andreas
Antworten
-
Hallo,
Das Zeilenweise einlesen bspws. mit File.ReadAllLines("C:\\...") halte ich für den besten Anfang der Umsetzung. Nun würde ich in einer Schleife alle Zeilen durchgehen, um immer, wenn ich mich gerade in einem dieser "Blöcke" befinde, die Daten in einem Objekt einer eigenen Strukur zu speichern. Ich glaube nicht, das du mehr als eine Ansammlung von Daten brauchst, darum auch eine Struktur ud keine Klasse.
Natürlich ist es immer davon abhängig, wie viele Daten du auslesen musst, was es für besonderheiten gibt usw. Wenn alle Werte immer in der selben Reihenfolge sind, kannst du es bspws. so machen:
string[] lines = File.ReadAllLines("C:\\Messungen.txt"); bool isInMessung=false; int i=0; foreach(string line in lines) { if(line.StartsWith("/begin Messung") { i = 0; //Wertenummer zurücksetzen isInMessung=true; } else if(line.EndsWith("/end Messung") isInMessung=false; else { if(isInMessung) { switch(i) { case 0: //Wert 1 auslesen break; case 1: //Wert 2 auslesen break; //usw... } ++i; //Für nächsten Wert vorbereiten } } }
Anstatt Wert 1/2/.. auslesen kannst du dann eine neue Instanz von der Kalsse Messung o.ä. zu einer Liste hinzufügen, die die Messungen verwaltet.
Wenn du die Daten dann wieder in XML-Dateien speichern willst, dann kannst du beispielsweise über XDocument gehen.
Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/
- Als Antwort vorgeschlagen Elmar BoyeEditor Sonntag, 2. Dezember 2012 17:52
- Als Antwort markiert Robert BreitenhoferModerator Montag, 10. Dezember 2012 09:01
-
Hallo zusammen,
mit .NET 4.0 und später sollte man File.ReadLines den Vorzug geben.
Damit sind dann auch große Dateien kein Problem mehr.Für oben muss man nur das foreach etwas ändern:
foreach(string line in File.ReadLines(@"C:\Messungen.txt", Encoding.UTF8))
Gruß Elmar- Als Antwort markiert Robert BreitenhoferModerator Montag, 10. Dezember 2012 09:01
Alle Antworten
-
Hallo,
Das Zeilenweise einlesen bspws. mit File.ReadAllLines("C:\\...") halte ich für den besten Anfang der Umsetzung. Nun würde ich in einer Schleife alle Zeilen durchgehen, um immer, wenn ich mich gerade in einem dieser "Blöcke" befinde, die Daten in einem Objekt einer eigenen Strukur zu speichern. Ich glaube nicht, das du mehr als eine Ansammlung von Daten brauchst, darum auch eine Struktur ud keine Klasse.
Natürlich ist es immer davon abhängig, wie viele Daten du auslesen musst, was es für besonderheiten gibt usw. Wenn alle Werte immer in der selben Reihenfolge sind, kannst du es bspws. so machen:
string[] lines = File.ReadAllLines("C:\\Messungen.txt"); bool isInMessung=false; int i=0; foreach(string line in lines) { if(line.StartsWith("/begin Messung") { i = 0; //Wertenummer zurücksetzen isInMessung=true; } else if(line.EndsWith("/end Messung") isInMessung=false; else { if(isInMessung) { switch(i) { case 0: //Wert 1 auslesen break; case 1: //Wert 2 auslesen break; //usw... } ++i; //Für nächsten Wert vorbereiten } } }
Anstatt Wert 1/2/.. auslesen kannst du dann eine neue Instanz von der Kalsse Messung o.ä. zu einer Liste hinzufügen, die die Messungen verwaltet.
Wenn du die Daten dann wieder in XML-Dateien speichern willst, dann kannst du beispielsweise über XDocument gehen.
Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/
- Als Antwort vorgeschlagen Elmar BoyeEditor Sonntag, 2. Dezember 2012 17:52
- Als Antwort markiert Robert BreitenhoferModerator Montag, 10. Dezember 2012 09:01
-
Hallo zusammen,
mit .NET 4.0 und später sollte man File.ReadLines den Vorzug geben.
Damit sind dann auch große Dateien kein Problem mehr.Für oben muss man nur das foreach etwas ändern:
foreach(string line in File.ReadLines(@"C:\Messungen.txt", Encoding.UTF8))
Gruß Elmar- Als Antwort markiert Robert BreitenhoferModerator Montag, 10. Dezember 2012 09:01
-
Hallo Bruce89,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.