In einer Textdatei bestimmte Zeilen suchen und diese Zeilen unterschiedlich auswerten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    In einer Textdatei bestimmte Zeilen suchen und diese Zeilen unterschiedlich auswerten

    Guten Abend,
    ich habe seit Samstag ein Problem mit einem Programm welches ich schreibe. Ich habe schon sehr, sehr viel gegoogelt und habe versucht es selber zu lösen, aber alle meine Versuche schlugen Fehl.
    Was ich genau machen möchte: Ich habe 2 Programme.
    1. Programm, Erstellen: In diesem Programm gebe ich einen Namen ein, danach einige Informationen. Dieser Name wird 1. in eine Textdatei für sich alleine in eine Zeile gespeichert (Keine anderen Namen in der selben Zeile) Die Informationen werden so abgespeichert: Erst kommt der Name, dann was er Abspeichert, dann die Informationen. All dies in einer Zeile.
    Dies sähe dann so aus:
    Spoiler anzeigen
    ​ Flugzeug_Name.txt
    Airbus A380
    *Anderes Flugzeug*
    ...

    Flugzeug_Eigenschaften.txt
    Airbus A380 Flugzeug Typ: Großraumflugzeug Flugzeug Hersteller: Airbus SAS Flugzeug Erstflug: 27. April 2005 (Es sind insgesamt ca 25 solch abgespeicherter Informationen)
    *Anderes Flugzeug*
    ...


    2. Programm, Anzeigen: In diesem Programm sollen diese Infos angezeigt werden, und verglichen werden können. Alle Flugzeug Namen werden in eine Listbox untereinander geladen. Nun komme ich zu meinem Problem: Ich möchte nun ein Flugzeug in der Listbox auswählen. Jetzt drücke ich auf den Knopf "Hinzufügen". Nun soll der Name den ich ausgewählt habe ausgelesen werden (Listbox1.SelectedItem). Mithilfe dieses Namens soll das Programm nun in die Textdatei "Flugzeug_Eigenschaften.txt" gehen, und dort die Zeile mit dem Namen suchen. Deshalb wird bei den Informationen der Name noch einmal davor geschrieben (Zumindest habe ich mir gedacht, das ich die richtige Zeile dann so finden kann, ich schlauer Fuchs :P ). Nun soll er die Informationen einzeln hinausnehmen d.h.: Er soll zu " Flugzeug Typ: " gehen, und dann die dahinterstehende Information (Oder mit " Flugzeug Typ: ", es wäre beides Praktisch) und in einem Label oder Textbox hineinschreiben, (Nächste Zeile) nun soll er zur nächsten Information gehen und (Flugzeug Hersteller: Airbus SAS), diesen nehmen, und das gleiche tun, und immer so weiter bis man bei der letzten Info angekommen ist.

    Ich habe sehr viel versucht. Ich habe auch nicht versucht einen fertigen Code zu bekommen, ich habe mir einzelne Befehle angesehen, wirklich alles. Jedoch komme ich einfach nicht weiter, und finde wirklich keine Lösung, weswegen ich hier auch keinen Code Posten kann (Wie weit ich denn bin, bzw. das ein Code nicht funktioniert).
    Ich wäre euch wirklich sehr, sehr dankbar wenn ihr mir bei dem Problem helfen könntet bzw. mir sogar den Code schreiben könntet. Am besten auch mit einer kleinen Erklärung, damit mein Spatzenhirn das auch versteht :thumbsup:
    Wenn ihr mir nicht den ganzen Code schreiben wollt, dann bitte ich euch dringendst dazu mir wenigstens zu erklären wie ich es, und mit welchen Befehlen ich es lösen kann. Am besten wäre jedoch die erste Variante :rolleyes:

    Zur Info nochmal, ich habe hier im Forum auch schon rumgesucht, und oftmals irgendwo Antworten gefunden wie "Das Speichersystem ist sehr schlecht und langsam. Änder das bitte." Aber es wurden keine Alternativen angegeben. Ich würde euch bitten, falls ihr vorhabt so etwas zu schreiben, ich würde gerne dieses System behalten, auch wenn es bei ein paar mehr Einträgen langsam ist.

    Mein verzweifelter Hilferuf
    Grüße ?(
    Ich würde es wie folgt machen:

    Du nimmst ein Dictionary von String auf String(oder vielleicht eine Info Klasse für die Flugzeug daten).

    Dann liest du irgendwo die Daten ein:

    VB.NET-Quellcode

    1. Dim flugzeuge() As String = IO.File.ReadAllLines(" Flugzeug_Name.txt")
    2. Dim flugzeugDaten() As String = IO.File.ReadAllLines("Flugzeug_Eigenschaften.txt")
    3. For i = 0 To flugzeuge.Count - 1
    4. _Dic.Add(flugzeuge(i), flugzeugDaten(i))
    5. ListBox1.Items.Add(flugzeuge(i))
    6. Next

    Im Event SelectedIndexChanged der ListBox kannst du dann wie folgt die Daten abfragen:

    VB.NET-Quellcode

    1. Dim flugzeug As String = ListBox1.SelectedItem.ToString
    2. If _Dic.ContainsKey(flugzeug) Then
    3. txtEigenschaften.text = _Dic(flugzeug)
    4. End If


    Es ist wahrscheinlich nicht die beste Lösung aber etwas besseres ist mir auf die schnelle nicht eingefallen.

    Mfg
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    Hallo erstmal,

    Nattürlich ist erstmal (fast) nichts unmöglich. Theoretisch könnte man also auch dein vorhandenes "System" verwenden und sich einen entsprechenden Client bauen. Das scheint mir aber sehr umständlich zu sein. Du machst dir hier sehr viele Probleme, die du dir sparen würdest wenn du auf eine vernünftige Struktur zum abspeichern / auswerten der Daten umsteigen würdest. Wenn du deine Struktur unbedingt behalten willst, hast du schonmal das Problem, das es z.B. keinen Delimeter (Ein eindeutiges Zeichen das zum Trennen der Informationen zuständig ist) gibt. Solltest du also irgendwann vor haben diese Informationen einzeln verarbeiten zu wollen wird dir das viele Probleme bereiten weil dein Programm niemals wissen wird wo eine Information anfängt und die vorangegangene Aufhört. Besser wäre hier zumindest etwas in der Art:

    Spoiler anzeigen

    Airbus A380 Flugzeug Typ: Großraumflugzeug | Flugzeug Hersteller: Airbus SAS | Flugzeug Erstflug: 27. April 2005 | ...


    in dem Beispiel wäre der Delimeter das " | " zeichen.

    eine noch bessere Vorgehensweise wäre eine XML Struktur zu verwenden. Diese kannst du nämlich verwenden wie eine Datenbank. Also durchsuchen, filtern etc.

    Wenn du dabei Hilfe benötigst kannst du mir gerne eine PN schreiben dann helfe ich dir so gut ich kann. Aber ich muss dich warnen. Ich bin niemand der einem die Lösung auf dem Silbertablett präsentiert. Ich helfe dir wenn du wo fest steckst aber du bekommst von mir keinen Fertigen Code.
    Ich habe mal eben eine stark vereinfachte Version von dem Programm gebastelt von dem ich denke das es ungefähr das ist was du haben willst. Der Unterschied besteht darin, das ich eine XML Dateistruktur verwende.

    Ansehen kannst du dir die Struktur in der Flugzeuge.xml Datei.

    Siehs dir mal an ;)
    Dateien
    • Flugzeuge.rar

      (14,52 MB, 50 mal heruntergeladen, zuletzt: )

    Cell schrieb:

    Wenn du dabei Hilfe benötigst kannst du mir gerne eine PN schreiben dann helfe ich dir so gut ich kann.

    Dein Engagement in allen Ehren, aber das ist wohl kaum im Interesse des Forums.

    @Daenni
    Ein Kollege hat mir mal erzählt, dass er in seinem Informatik Studium die Aufgabe bekommen hatte, ein Programm komplett basierend auf Text Dateien, zu entwickeln.

    Klar ist unbequem, aber wenn es läuft hast du so viele Probleme gelöst, was der Hauptbestandteil (!) vom Programmieren ist, das du richtig was dabei gelernt hast.

    Habe damals in meinen Anfangszeiten nen Ticketing-System programmiert das nur mit Text Dateien arbeitet. Da bin ich durch die Hölle und wieder zurück ;)

    Schreibe doch die einzelnen Eigenschaften der Flugzeuge untereinander, dass ist einfacherer am Anfang. Letztendlich kannst du dann deine Datei Zeilenweise einlesen. Dein Trenner *Anderes Flugzeug* ist schon mal gut. Liest du die Datei Zeilenweise ein, weißt du, dass danach der Flugzeugtyp kommt, in der nächsten Zeile der Hersteller, etc.

    @Cell wie unsportlich, Xml ist natürlich besser aber nicht die Aufgabenstellung ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    ​Dein Engagement in allen Ehren, aber das ist wohl kaum im Interesse des Forums.


    Das mag schon sein. Aber das ganze Thema hier Schritt für schritt in einem Threat durchzugehen erschien mir unpassend. Besonders im Hinblick darauf das hier noch andere Leute sind die wie du und ich nicht einer Meinung sind. Dann artet eine einfache Frage zu einem einfachen Programm evtl. ein eine Grundsatzdiskussion aus die den Threatersteller nur verwirren. Ich habe dieses Angebot gemacht weil ich die Zeit und den Willen habe jemandem etwas bei zu bringen. ob das nun genutzt wird oder nicht überlasse ich dem Ersteller des Threats. Ob das nun im Sinne des Forums ist... ich denke darüber lässt sich streiten. Ich bezweifle aber das Daenni wenn er sein Problem gelöst hat das Forum nie wieder aufsuchen wird. Angesichts dessen habe ich mit meinem Engagement wenig bis keinen Schaden angerichtet.

    Ein Kollege hat mir mal erzählt, dass er in seinem Informatik Studium die Aufgabe bekommen hatte, ein Programm komplett basierend auf Text Dateien, zu entwickeln.Klar ist unbequem, aber wenn es läuft hast du so viele Probleme gelöst, was der Hauptbestandteil (!) vom Programmieren ist, das du richtig was dabei gelernt hast.Habe damals in meinen Anfangszeiten nen Ticketing-System programmiert das nur mit Text Dateien arbeitet. Da bin ich durch die Hölle und wieder zurück


    Als ich mit dem Programmieren angefangen habe, habe ich auch meine Daten in Textdateien geschrieben und sie dann von Hand wieder eingelesen und von einer Funktion interpretieren lassen. Dabei bin ich ganz ähnlich vorgegangen wie du es vorgeschlagen hast. Zeilenweise einlesen etc.
    Dann habe ich angefangen zu Studieren und man hat mir im Rahmen dieses Studioms gezeigt wie man dieses Problem, ich sage jetzt mal eleganter löst. Also habe ich in meinem Fall bestenfalls gelernt wie man es nicht macht. Zudem hat es mich viel Zeit und Energie gekostet mir diese Vorgehensweise wieder abzugewöhnen.

    ​@Cell wie unsportlich, Xml ist natürlich besser aber nicht die Aufgabenstellung


    Du hast natürlich recht. Das war nicht die Aufgabenstellung. Vielleicht könnte man das umsteigen auf XML sogar als "mogeln" bezeichnen weil ich das eigentliche Problem auf diese Art und weise umgangen habe. Allerdings denke ich das du mir zustimmen wirst, wenn ich die Behauptung aufstelle, das die vorgegebene Datenstruktur ohne das man sie in irgendeiner Form ändert (sei es z.B. durch hinzufügen eines Delimeters) unmöglich zu verarbeiten gewesen wäre. Und wenn ich schon die Datenstruktur verändern muss dann bevorzuge ich dann doch eine Lösung die effizienter und einfacher in der Handhabung ist.

    Alles in allem denke ich das Daenni so oder so etwas bei der ganzen Geschichte lernt. Insofern können wir uns vielleicht darauf einigen, dass wir nicht einer Meinung sind. ;)
    @Cell ich bin da ganz auf deiner Seite, wir sind also schon einer Meinung :) Das mit den Textdateien ist nicht die Beste Variante. Und auch die gegebene Struktur des TE ohne Delimeters weniger gut. Lernen durch Schmerz ist meine Devise ;)

    Idealerweise sollte er einfach ne Klasse für seine Flugzeuge schreiben und diese serialisieren/deserialisieren. Aber soweit ist er ja noch nicht ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    Idealerweise sollte er einfach ne Klasse für seine Flugzeuge schreiben und diese serialisieren/deserialisieren
    Das war das erste, was mir bei der Aufgabenstellung einfiel.
    Und ob er jetzt mühevoll irgendwelche Textdateien auswertet oder gleich ein gescheites Objektmodell aufsetzt, wird sich zeitlich nicht so sehr unterscheiden.
    Nur hat er mit dem Deserialisierungsansatz gleich etwas wirklich Brauchbares für die Zukunft gelernt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --