Entwickler-Ecke
WinForms - Projekt Parser
Eagle92 - Mi 29.06.11 12:55
Titel: Projekt Parser
Erstmal Guten tag an alle,
mir bietet sich folgendes Problem und zwar soll ich für meine Forschungsabteilung einen Parser Entwickeln.
Er soll so aufgebaut sein das dieser Parser sich seine Voreinstellung (Arrays etc.) aus einer Konfigurations Klasse holt, mit hilfe von ihnen soll er dann aus einem Text Dokument die Daten Raus holen abspeichern und an eine andere Klasse übergeben die dann den Namen DatenContainer trägt um die Daten übergabe auf zu nehmen und ab zu speichern.
Allerdings bin ich in dem Gebiet noch Absolut unerfahren, bisher konnte ich nur grundwissen über C++ und java durch die schulische Ausbildung ergattern, das heißt ich Schwimme momentan in einem komplett fremden Gebiet und lande nach einer Lösung direkt ins Problem....
Was ich bisher erreichen konnte war ein auslesen des Text Dokuments über den Parser, bei allem weiteren steh ich immer noch vor einem Riesen Fragezeichen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public static void Main(string[] args) {
string contents = System.IO.File.ReadAllText(@"C:\t1");
Console.Out.WriteLine("contents = " + contents);
} |
Ist leider bisher das einzige was ich für dieses Projekt erreichen konnte.
Enttäuschend wenig.
Ich hoffe ihr könnt mir Helfen mein Ziel in kürzester Zeit zu Erreichen.
(Das Ganze Spielt sich natürlich in der KonsolenApplikation von Visual Studio 2008 Vollversion ab)
Grüße,
Patrick
Moderiert von
Th69: C#-Tags hinzugefügt
Yogu - Mi 29.06.11 13:40
Wie sieht das Format des Textdokumebts denn aus? Kannst du vielleicht ein Beispiel posten?
Eagle92 - Mi 29.06.11 14:11
Also:
Nach ein bisschen Googlen, Lesen und einem Gespräch bin ich nun so weit:
Die Konfigdatei:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| namespace Parser {
class ConfigurationFile { private string path = "C:\\Praktikum_20_06_2011\\Parser1\\Parser\\Autos.txt";
public string GetPath { get { return this.path; } } |
Der Parser:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| namespace Parser { class Parser { ConfigurationFile config; public Parser() { config = new ConfigurationFile();
} public void ReadData() { string contents = System.IO.File.ReadAllText(config.GetPath); Console.Out.WriteLine(contents); } } } |
Das Programm:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| namespace Parser { class Program {
public static void Main(string[] args) { Parser Parse = new Parser(); Parse.ReadData(); Console.ReadLine(); } } } |
Die Textdatei mit dem Format ".txt":
Name: BMW 316 I Kompakt
Kennzeichen: LIP PH 73
PS: 96
Farbe: Schwarz
Name: Toyota Supra
Kennzeichen: LIP KJ 109
PS: 170
Farbe: Silber Metallic
Name: Mazda RX-7
Kennzeichen: ST Q 9
PS: 230
Farbe: Dunkel Blau
Was nun noch Fehlt ist quasi der Daten Container mit den Arrays die dies dann Absichern müssen.
Alles weitere soll nun so aussehen das ich quasi eine struktur erstellen muss für dieses Autos und dann mit einer Liste verbinde
etwa nachdem verfahren:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| struct Auto { string Name; int PS; int Kennzeichen; string Farbe; } |
Da bei mir ab jetzt erst mal wieder die Lichter wieder aus sind, da mir jegliche Befehle und Grund kenntnisse fehlen hoffe ich auf eure Hilfe wie ich dieses Programm fortfahren kann.
Mit freundlichen Grüßen
Patrick
Yogu - Mi 29.06.11 14:40
Hallo,
eine Liste von
Auto-Objekten deklarierst du mit
List<Auto>, aber das sind wirklich Grundlagen. Ich würde vorschlagen, dass du zunächst deine Programmierkenntnisse mit einem Buch, z.B. diesem
kostenlosen eBook [
http://openbook.galileocomputing.de/visual_csharp_2010/], etwas erweiterst. Zumindest solltest du dann wissen, wie du allgemein vorgehen kannst. Wenn du den Parser nicht gleich hinbekommst oder eine andere spezifische Frage hast, kannst du diese natürlich gerne hier stellen.
Grüße,
Yogu
Th69 - Mi 29.06.11 15:10
Hallo Eagle92,
bitte packe deinen C#-Code in entsprechende [ cs ] ... [ /cs ] - Tags (ohne die Leerzeichen) bzw. markiere den Source und benutze unter "Bereiche" den "+"-Button (ich habe bei deinem ersten Beitrag dies schon editiert). Dazu einfach auf "Beitrag bearbeiten" klicken.
Danke
Th69
Eagle92 - Do 30.06.11 12:59
So hallo nochmal von mir,
ich habe mitlerweile einige recherchen angestellt und was heraus gefunden, leider plagt mich immer noch ein problem...
wie kann ich meine Daten aus dem Parser in meinen Daten Container einbringen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Program Data;
public string Datas() { Data = new Program(); }
struct Car { List<string> name = new List<string>(); List<string> PS = new List<string>(); List<string> color = new List<string>(); List<string> indicator = new List<string>(); } |
diese Struktur verfolg ich momentan, allerdings habe ich auch vieles über get und set gelesen und auch rum probiert.
Für diesen Code fehlen mir allerdings noch die befehle zum übermitteln der Daten in den Daten Container, könnt ihr mir vielleicht ein paar kleine Tipps zu dem List<T> bzw. überhaupt der Daten übergabe geben ?
Wäre euch sehr verbunden.
Freundliche Grüße
Patrick
Yogu - Do 30.06.11 13:16
Jetzt hast ducein Auto mit einer Liste von Namen, Leistungsangaben etc. - und keine Liste von Autos. Dein letzter Struct sieht ganz gut aus. Und davon brauchst du die Liste.
Eagle92 - Do 30.06.11 13:38
Habe mitler weile einiges geändert, den Parser mit diesem Code umd einzelne zeilen aus meiner ".txt" datei auslesen zu können.
C#-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:
| namespace Parser { class Parser { ConfigurationFile config; Container data; public Parser() { config = new ConfigurationFile(); data = new Container(); } public void ReadData() { String line = ""; try { StreamReader contents = new StreamReader(config.GetPath); while ((line = contents.ReadLine()) != null) { Console.Out.WriteLine(line); } contents.Close(); } catch { if (line == "") { Console.Out.WriteLine("Fehler beim Lesen!"); } }
data.Datas(); } |
und mein Container sieht nun wie folgt aus:
C#-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:
| namespace Parser { public struct Car { public string name; public string color; public string indicator; public string HP; };
class Container {
public string Datas() { string overhand = "Hallo";
Car carInformation;
carInformation.name = "BMW"; carInformation.color = "Blue"; carInformation.HP = "122"; carInformation.indicator = "X4";
List<Car> Cars = new List<Car>();
Cars.Add(carInformation);
Console.WriteLine("Number of elements in list is: ", Cars.Count); return overhand; } |
was meine Frage nun zum einen ist, ist es sinnvoll es so zu lassen das ich im Parser die Text datei zeilenweise auslese ?
zum anderen, wie kriege ich denn nun die eingespeicherten Daten die jeweils in der Textdatei mit "Name" in
carInformation.name
mir bereiten die übergaben leider große probleme,vielleicht kann mir da jemand helfen/vielleicht ein beispiel bieten ? ich wäre sehr dankbar über eure hilfe um das ganze nun weiter fort setzen zu können.
freundliche Grüße
Patrick
daeve - Sa 02.07.11 23:41
Hallo
also mal einen kleiner Tipp... google doch nach deinen Poblemen...
z.B textfile einlesen c#
bei mir 2 oberstes ergebniss
http://www.tsql.de/csharp/csharp_textdatei
hier hast du Beispiele mit Kommentar...
hoffe das hilft.
Eagle92 - Mo 04.07.11 07:30
Danke für eure Hilfe, mit dem StartsWith klappts =) melde mich bei weiteren problemen =)
Eagle92 - Mo 04.07.11 08:20
könntest ihr vielleicht ein Beispiel posten wie ich das genau Anwende ?
Das problem:
Die ganze sache erfüllt zwar seinen Zweck, allerdings sobald ich was daraus löschen möchte bekomme ich folgende Situation:
Angaben im Dokument:
Name:BMW 316 I Kompakt
Kennzeichen:LIP PH 73
PS:96
Farbe:Schwarz
Ausgabe in der Console:
BMW 316 I Kompakt
BMW 316 I Kompakt
Quellcode:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| bool search = line.StartsWith("Name:"); if (search == true) { string line2 = line.Remove(0,5); Console.WriteLine(line2); } |
Das "Name:" verschwindet ist so weit richtig allerdings brauche ich auch noch die anderen Daten des Dokuments...
Im Internet ist leider auch nur schwer was zu finden, ich hoffe das ihr mir helfen könntet.
(Ich Vermute auch das es am Remove liegt, allerdings weiß ich nicht wie das sonst richtig auf diese Situation anwenden soll außer durch dummes ausprobieren bis es klappt... im Internet wird das ganze zwar auch erklärt, allerdings nur für die Fälle wo aus einer Zeile gelöscht wird und nicht aus der ganzen Textdokument ausgabe wie bei mir...)
freundliche Grüße
Patrick
norman2306 - Mo 04.07.11 09:16
Am besten du arbeitest mit einer Switch Anweisung. Du hattest doch irgendwo mal das:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| StreamReader contents = new StreamReader(config.GetPath); while ((line = contents.ReadLine()) != null) { Console.Out.WriteLine(line); } contents.Close(); |
Da machst du jetzt mal ein switch-Anweisung rein:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| StreamReader contents = new StreamReader(config.GetPath); while ((line = contents.ReadLine()) != null) { string[] carInfos = line.Split(':'); if(carInfo.Length >= 2) switch(carInfos[0]) { case "Name": carInformation.Name = carInfos[1]; break; case "Kennzeichen": carInformation.Kennzeichen = carInfos[1]; break; . . . } } contents.Close(); |
Und bitte tue dir den gefallen, zu recherchieren was die 'Split'-Funktion und die switch-Anweisung machen.
mfg Norman
Eagle92 - Mo 04.07.11 09:29
Was switch und split ist, weiß ich mitlerweile recht gut ^^ da ist nicht das Problem, sondern einfach nur mich in diese neue sprache rein zu finden...
Deine Lösung find ich gut und werd ich gleich mal austesten, allerdings hab ich auch was interessantes herausgefunden,
Ich habe diesen Code verwendet um eigentlich nur "Name:" zu löschen, allerdings macht der Code genau das, was du im switch case drin hast, hast du dafür eine erklärung ?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| string str = line; string[] teile; char[] trennzeichen = {':'}; teile = str.Split(trennzeichen);
foreach (string wort in teile) { line = wort.Replace("Name:", ""); } Console.WriteLine(line); |
Die Ausgabe:
BMW 316 I Kompakt
LIP PH 73
96
Schwarz
Die Ausgabe erscheint also vollkommen richtig, ich denke er geht von dem ":" aus oder ?
Th69 - Mo 04.07.11 09:49
Hallo Eagle92,
das liegt an deiner Schleife, da du ja für jedes 'wort' die Variable 'line' neu zuweist.
Daher führt auch folgendes zum gleichen Ergebnis:
C#-Quelltext
1: 2: 3: 4:
| foreach (string wort in teile) { line = wort; } |
Und da du eh nur am letzten 'wort' interessiert bist, kannst du daher auch anstatt der Schleife einfach
C#-Quelltext
1: 2: 3:
| line = wort[1]; line = wort[teile.Length-1]; |
schreiben (so wie Norman es ja auch in seinem Code verwendet).
Eagle92 - Mo 04.07.11 14:33
Vielen Dank für die Antworten =) das was Norman mir geraten hat, hab ich rein integriert und klappt auch alles wundervoll, er speichert wie er soll =) allerdings hab ich nun eine neue problematik ... -.-"
wie kann ich nun den gespeicherten inhalt meiner liste in einer Funktion aufrufen und Ausgeben lassen ?
hab schon einen Test zur Überprüfung rein gebaut, der mir nun anzeigt das was gespeichert ist, allerdings kann ich nicht auf meinen gespeicherten Inhalt zugreifen.
So sieht das ganze nun aus:
C#-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:
| namespace Parser { public struct Car { public string name; public string color; public string indicator; public string HP; };
class Container { string[] carInfos = new string[4]; Car carInformation; List<Car> Cars = new List<Car>(); public void Read() { }
public void LineCalculation(string line) { string str = line; string[] teile; char[] trennzeichen = { ':' };
teile = str.Split(trennzeichen);
foreach (string wort in teile) { } Console.WriteLine(line);
TypCalculation(line); }
public void TypCalculation(string line) {
for(int x = 1; x < 5; x++) { switch (carInfos[0]) { case "Name": carInformation.name = carInfos[x]; break; case "Kennzeichen": carInformation.indicator = carInfos[x]; break; case "PS": carInformation.HP = carInfos[x]; break; case "Farbe": carInformation.color = carInfos[x]; break; default: if (line == "") { Cars.Add(carInformation); Console.WriteLine(Cars.Count); } break; }
} } } } |
(meine gescheiterten Versuche spar ich mir mal ^^)
wenn mir jemand nochmal helfen könnte die gespeicherten Inhalte ab zu rufen wär ich zu Dank verpflichtet.
Freundliche Grüße
Patrick
Th69 - Mo 04.07.11 15:04
Hallo Eagle92,
mit welchem Buch lernst du denn C#, denn deine Fragen sind doch elementare Grundlagen der Programmierung? Empfehlen kann ich dir das
OpenBook: C# [
http://www.galileocomputing.de/openbook/csharp]
Aber die eigentliche Antwort auf deine Frage: die Daten stehen doch in der Liste Cars drin, so daß du diese nur auszulesen brauchst
C#-Quelltext
1: 2: 3: 4:
| foreach(Car car in Cars) { Console.WriteLine(car.name); } |
Eagle92 - Di 05.07.11 11:02
Hallo Th69,
ich verwende die Liste erst zur Parameter absicherung und dann zur Parameter Übergabe, daher ist das kein guter Weg sie so ausgeben zu lassen da es ja dann im Container erscheint ^^,
ich für meinen Teil habe mitlerweile eine Neue Funktion erstellt um mit dieser, die Liste an meinen Parser weitergeben zu können und vom Parser zum Programm wo sie dann letzten endes erscheinen soll, dass ist das letzte Problem, danach ist mein kleiner Parser fertig =)
nochmal allen Danke die Versucht haben zu helfen und es mit mir ausgehalten haben ^^'
ich gucke ob ich das mit der Übergabe allein schaffe,
aber gegen Tipps zum Abruf + Übergabe der Liste ist weiterhin mein Ohr offen,
wenn interesse besteht kann ich dann diesen Parser bereitstellen, er ist ziemlich simpel zu verstehen und ich denke für Anfänger mit änlichen Problemen einfacher zu durchblicken bezüglich der Funktionen etc. schließlich kommt er ja auch von einem Anfäger der reichlich für ihn geblutet hat =D
Mit freundlichen Grüßen
Patrick
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!