Laden...

LUA Datei auslesen und deren Inhalt bearbeiten

Erstellt von r2d2 vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.324 Views
Thema geschlossen
R
r2d2 Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren
LUA Datei auslesen und deren Inhalt bearbeiten

Erstmal hallo zusammen.
Ich bin neu hier und auch die Sprache C# ist für mich Neuland. Da mich diese Sprache aber sehr interessiert würde ich gerne mehr darüber in Erfahrung bringen...

Objektorientierte Sprachen sind für mich nicht neu und der Einstieg in die Welt von C# deswegen (hoffentlich) nicht ganz so schwer wie für einen der noch nie programmiert hat.

Ich versuche anhand eines kleinen Projektes das als künftige Basis-Vorlage dienen soll wenn es mal fertig ist, der Sprache etwas näher zu kommen und sie so besser zu verinnerlichen.

So das vorraus, nun zu meinem Problem, ich versuche vergebens eine in der Programmiersprache "LUA" erstellte externe Tabelle mit dem Namen "test.tbl" in eine mit VisualStudio 2010 erstellte "Windows Forms" zu laden, präziser gesagt versuche ich nur die Werte der Variablen dieser Tabelle in die "TextBox"en die ich auf dieser Form erstellt habe zu laden und zwar so das ich sie wenn ich sie dann über die TextBox verändert habe wieder speichern kann.

Hier der Inhalt der LUA Tabelle "test.tbl":


luaTable {

    string_01 = "Zeichenkette",
    string_02 = true,
    string_03 = 10
    string_04 = { 20, 30 },

}

Das Ziel sollte also sein die Werte der Strings "Zeichenkette", "true", "10", "20, 30"
per Button in die TextBoxen zu übertragen und zwar so das ich sie wenn ich sie in den TextBoxen verändere mit den veränderten Werten zurückspeichern kann (per Button).

Wenn mir einer von euch für diese kleine Aufgabe einen Code mit aussagekräftigen Comments schreiben könnte, wäre das prima, ich könnte es dann als Basis-Vorlage nehmen und selbst darauf aufbaun.

Danke schon mal im Vorraus für den der sich für mich die Mühe macht, ein paar Minuten seiner Zeit zu opfern...

MfG r2d2

PS: Was ich vergessen habe zu erwähnen, natürlich ist das nur ne Beispiel Tabelle, die Methode: Gehe in Zeile xy und lies den Inhalt zwischen "..." aus ist keine Lösung, es müsste etwas wie: Lese ganze Datei aus, hol sie in eine z.B. Array Liste rein, suche die Liste ab nach "string xy" und dann lies dessen Wert zwischen ".." aus.

799 Beiträge seit 2007
vor 13 Jahren

Schau da mal rein, vor allem sieh dir die PUnkte 4a u. 4c an.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
R
r2d2 Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren

Ich bin Deinem Link gefolgt, aber der bringt mich nur zu einem anderen Thread, und dort finde ich kein 4a und 4c.

799 Beiträge seit 2007
vor 13 Jahren

Sorry, mein Fehler. Hier noch einmal: Wie poste ich richtig?

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
R
r2d2 Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren

Ach jetzt weiss ich worauf du anspielst:

4a. Verlangt keine fertigen Lösungen

Bitte fragt nicht nach einem vollständigem Quellcode, der genau euer Problem löst. Gebt uns andersherum auch nicht euren kompletten Quellcode und fragt wo der Fehler ist. Wir machen nicht eure (Haus-)aufgaben, leisten aber gerne jederzeit Hilfestellungen bei euren Problemen und bei der Fehlersuche.

-> Ich frage ja nicht nach einem kompl. Code sondern nur nach einem Code als Basis für mein Problem, ich hab es hier nicht nur mit ner kleinen LUA Tabelle zu tun sondern mit einem ganzen Haufen dieser Tabellen, darüberhinaus noch ein Dutzend anderer Geschichten die ich irgendwie in meine Windows Form bringen muss, deswegen wollte ich im Grunde nur ne kleine Code-Vorlage auf die ich dann im Selbststudium weiter aufbaun kann ohne dauernd dumme Fragen stellen zu müssen, denn ich beiss mich dann da schon irgendwie durch....

4c. Wälzt nicht eure Aufgaben auf uns ab

Wundert euch nicht, wenn es zum Teil sehr heftige Gegenreaktionen gibt, falls ihr doch nach fertigen Lösungen fragt oder anderweitig der Eindruck entsteht, dass ihr uns kostenlos für eure Aufgaben einspannen wollt.

-> War keineswegs mein Ziel, es war eher ne Art "Programmierer hilft Programmierer" Geschichte, ich kenne das selbst und helfe auch sehr gern wenn ich kann und schreibe Codebeispiele in den Sprachen PHP, JAVA, LUA

Ich denke mal diese: Gugg doch mal in der "Wie stellen noobs Fragen richtig" Antwort ist sehr beliebt, hilft nur dem der sie bekommt herzlich wenig, ich mein es gibt wirklich Fragen da könnte man die Wände hochgehn, ich hoffe meine war keine solche...

Aber vielleicht hab ich ja zuviel erwartet, ich bin nur von meiner eigenen Hilfsbereitschaft ausgegangen, verzeih wenn ich die dirzufolge "Foren-Frage-Kompetenz" überschritten habe...

MfG r2d2

R
r2d2 Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren

Die Code-Vorlage wäre natürlich ideal als Grundlage, mir würden aber notfalls auch Links genügen die folgende Fragenstellungen behandeln:

  • Wie suche ich einen Text der in eine ArrayList geladen wurde nach Strings und der Gleichen ab und wie mach ich dem Code klar das er bei dem gefundenen String den Wert auslesen soll

  • Wie speichere ich diesen Wert der sich gegebenenfalls verändert hat wieder zurück in die Datei

1.029 Beiträge seit 2010
vor 13 Jahren

Hallo,

um dir zumindest einen Ansatzpunkt zu liefern:
Die Datei könntest du z.B mit dem StreamReader auslesen - Beispiele zur Verwendung
gibt es bestimmt genug 😛

Beispielsweise könnte man mit

.ReadLine()

zeilenweise auslesen.

Zum Schreiben gibt es dann unter andrem den StreamWriter 😉

Und der Klasse "String" solltest du allenötigen Funktionen finden 😉

Zum Anzeigen würde ich jetzt einfach mal den DataGridView vorschlagen...

Generell wäre es vll doch einfacher und auch angenehmer vll ein paar Tutorials
durchzuackern...

Gruss und viel Glück

Achim

R
r2d2 Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren

Also ich hab mir jetzt mal die Klasse "String", "File" und "Stream" einverleibt, habe aber leider nichts gefunden das es mir irgendwie ermöglicht z.B. in einer ArrayList einen gewissen String zu finden und dessen Wert auszulesen...

ich kann mit String(char[], <startzahl>, <endzahl>) durch einen String iterieren und mir einen Teil (von-bis) des Wertes rauspicken...

ich kann mit string str = "blabla"; char newChar = str[<zahl>]; durch den String iterieren und mir ein einziges Zeichen daraus rauspicken...

aber wie mache ich es das er mir den ganzen Wert ausliest (alles zwischen "...") ?

B
51 Beiträge seit 2008
vor 13 Jahren

So wie ich das sehe representieren die Werte in Deiner LUA Datei nicht nur Strings sondern auch boolsche Werte und andere Typen sowie Arrays.
An Deiner Stelle würde ich daher eher versuchen die einzelnen Einträge zu interpretieren und die Werte in den passenden Variablentypen abzulegen.
Die einzelnen Variablen kannst Du ja z.B. in einer List<object> oder in einem Dictionary speichern.

Sonst wird es schwierig aus den Werten später wieder die Datei zu erzeugen. Wenn Du alles als String verarbeitest wird aus dem Eintrag

string_02 = true

schnell

string_02 = "true"
  1. Datei zeilenweise lesen mit StringReader
  2. In der gelesenen Zeile nach dem ersten "=" Zeichen suchen (String.IndexOf)
  3. Den Teil hinter dem "=" mit String.Substring extrahieren
  4. Leerzeichen mit String.Trim entfernen
  5. Den Wert interpretieren, z.B. mit bool.TryParse oder String.StartsWith und in Variable speichern
  6. Die Werte anzeigen

Wenn die Änderungen gespeichert werden sollen gehst Du deine Liste einfach durch und erzeugst zeilenweise Deine Datei aus den Variablen.

Dein Ziel sollte es also sein die Datei im Speicher abzubilden, dort die Änderungen durchzuführen und aus diesen Daten die Datei wieder zu erzeugen und die vorhandene zu überschreiben.

Ich würde Dir empfehlen mal nach "c# lua parser" zu googlen. Ich denke mal da findet sich das eine oder andere.

1.346 Beiträge seit 2008
vor 13 Jahren

Ich würde das mit Regex lösen.

(?<tablename>.*?).\{\s*((?<key>.*?)\s*=\s*(\{(?<value>.*)\}|(?<value>.*?))\s*,\s*)*\s*\}

(grad mal schnell gebastelt.

string input = @"luaTable {

    string_01 = "Zeichenkette",
    string_02 = true,
    string_03 = 10,
    string_04 = { 20, 30 },

}";
string regex = "(?<tablename>.*?).\{\s*((?<key>.*?)\s*=\s*(\{(?<value>.*)\}|(?<value>.*?))\s*,\s*)*\s*\}";
Match m = Regex.Match(input, regex);
string tablenname = m.Groups["tablename"].ToString();
Debug.WriteLine("Die Tabelle heißt: " + tablenname
Dictionary<string,string> results = new Dictionary<string,string>();
for(int i = 0; i< m.Groups["key"].Captures.Length; i++)
{
string key = m.Groups["key"].Captures[i].ToString();
string value = m.Groups["key"].Captures[i].ToString();
Debug.WriteLine(key + "=>" + value);
results.Add(keymvalue);
}

Sollte liefern:

Die tabelle heißt: loaTable
string_01=>"Zeichenkette"
string_02=>true
string_03=>10
string_04=>20, 30 (PS müsstest du dann noch mit string.Split teilen)

Wenn du dir Regex aneignen möchtest such hier am besten mal nach regexlab. Das ist ein von herbivore geschriebenes Tool um reguläre Ausdrücke zu testen. Wenn du F1 drückst gibt es auch eine kleine Referenz. Das ist äußerst praktisch 😉

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo r2d2,

schreib direkt einen Parser. Dann bist du auf der sicheren Seite. Mit RegEx würde ich das nicht lösen, weil es an einigen Stellen "unsicher" ist. Wenn du direkt einen Parser verwendest, kannst du viel einfacher auf die Inhalte zugreifen oder auch nach Inhalten suchen. Du hast dann feste Objekte in der Hand. In RegEx musst du alle manuelle machen. Schau mal auf den Seiten von CodeProject oder CodePlex. Dort findest du bestimmt was.

zero_x

Hinweis von herbivore vor 13 Jahren

Aber vielleicht hab ich ja zuviel erwartet, ich bin nur von meiner eigenen Hilfsbereitschaft ausgegangen, verzeih wenn ich die dirzufolge "Foren-Frage-Kompetenz" überschritten habe...

Ja, das hast du leider, nicht nur in des der-schlingels Augen. Du hast genau entgegen dem, was du in der Rechtfertigung geschrieben hast, genau das getan, was [Hinweis] Wie poste ich richtig? verbietet: Nach Code gefragt, der deine Aufgabe löst, selbst wenn du danach geschrieben hast, dass du auf dieser Basis alleine weiterentwickeln willst. Damit wirst du hier immer auf wenig Gegenliebe stoßen, obwohl wir sehr hilfsbereit sind. Die Arbeit für jemand anderen zu machen, hat einfach nichts mehr mit Hilfsbereitschaft zu tun.

Die Fragen, die du ersatzweise gestellt hast, fallen alle unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Wir erwarten, dass man erst ein C# Buch durcharbeitet, bevor man Fragen stellt. "Gemeinsam mehr erreichen" bedeutet eben auch, dass Einsteiger ihren Teil beitragen. Da werden dann all solche Frage, wie öffne und lese ich eine Datei, wie kann ich in Strings suchen (und hoffentlich auch, warum soll ich auf keinen Fall mehr ArrayList verwenden) geklärt. Alle deine Fragen wären damit erschlagen gewesen. Natürlich ist es schwer, wenn man ein konkretes Problem hat, in einem Buch was passendes herauszusuchen. Aber ist ja nicht der Vorschlag, sondern der ist wirklich erst das Buch (komplett) durchzuarbeiten.

Thema geschlossen