Text Datei bis zu einem bestimmten Zeichen in Listbox einlesen

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von MisterRieus.

    Text Datei bis zu einem bestimmten Zeichen in Listbox einlesen

    Guten morgen zusammen,
    habe zwei kleine Probleme.

    1) habe folgende txt Datei:
    G.WAKABAYASHI|96|100|10|10|10|10|10|10|10|10|
    T.OZORA|95|10|50|50|50|60|100|75|85|90|

    Nun sollen alle Zeilen bis zum ersten | als Item in eine Listbox eingelesen werden. Wie stelle ich das an?
    Wie ich die ganzen Zeilen eingelesen bekomme weiß ich, aber nicht wie ich nur den ersten Teil der jeweiligen Zeile bis zum | einlesen kann.
    Sprich die Listbox soll dann so aussehen:
    G.WAKABAYASHI
    T.OZORA

    Vielen Dank.
    @MisterRieus Da gibt es zwei Möglichkeiten:
    Du liest die gesamte Datei ein
    oder
    Du liest die Datei zeilenweise ein.
    Vorausgesetzt, das gesuchte Zeichen befindet sich im Text (ansonsten suchen und ggf. abbrechen):
    Den gelesenen Text an Zeichen splitten und den Part mit Index 0 verwenden.

    VB.NET-Quellcode

    1. Dim parts() = DER_TEXT.Split(DAS_ZEICHEN)
    2. MessaheBox.Show(parts(0))
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Quellcode

    1. Dim Meinstring As String = My.Computer.FileSystem.ReadAllText("Spielerdatenbank.txt")
    2. Dim parts() = Meinstring.Split("|")
    3. ListBox1.Items.Add(parts(0))


    Damit wird G.WAkABAYASHI in die Listbox geaddet. Das passt.
    Es soll aber aus jeder Zeile der Inhalt zwischen den ersten beiden | in die Listbox geaddet werden.
    Sprich als nächstes dann T.OZORA.

    ListBox1.Items.Add(parts(9))

    Damit würde es gehen. Gibt es eine Möglichkeit, dass alle 9 Parts der Inhalt in die Listbox geaddet werden?
    Sprich anstatt
    ListBox1.Items.Add(parts(9))
    ListBox1.Items.Add(parts(18))
    ListBox1.Items.Add(parts(27))
    ListBox1.Items.Add(parts(36))

    als eine Codezeile?
    @MisterRieus Da hast Du in Post #1 nicht die vollständige Aufgabenstellung gepostet. ;(
    Wie kommst Du auf die Schrittweite 9?
    Probierma

    VB.NET-Quellcode

    1. ListBox1.Items.AddRange(parts)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    G.WAKABAYASHI|96|10|10|10|10|10|10|
    T.OZORA|10|50|50|50|60|100|75|

    Parts(0) = G.WAKABAYASHI
    Parts(1) = 96
    Parts(2) = 10
    Parts(3) = 10
    Parts(4) = 10
    Parts(5) = 10
    Parts(6) = 10
    Parts(7) = 10
    Parts(8) = T.OZORA

    Wenn ich folgendes mache

    Quellcode

    1. Dim Meinstring As String = My.Computer.FileSystem.ReadAllText("Spielerdatenbank.txt")
    2. Dim parts() = Meinstring.Split("|")
    3. ListBox1.Items.AddRange(parts)

    dann sind auch die anderen Werte wie die ganzen 10ner Werte in der Listbox.
    In dieser sollen aber nur von jeder Zeile der erste Part bis zum | eingetragen werden.

    Aso und wie ich auf Schrittweise 9 bzw. 8 komme? Jede Zeile besteht immer aus 8 Parts. 1x Name und 7x Werte.
    @MisterRieus OK.
    Am besten, Du liest nicht den gesamten Text auf einmal ein, sondern arbeitest mit .ReadLine() und arbeitest den Inhalt zeilenweise ab, das ist übersichtlicher und letzten Endes einfacher.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Du könntest auch erstmal alle Zeilen splitten, z.B.

    VB.NET-Quellcode

    1. Dim rows As String() = Meinstring.Split(New String() {vbCrLf}, StringSplitOptions.RemoveEmptyEntries)

    Oder noch besser wie @RodFromGermany bereits erwähnt: Das Einlesen bereits Zeilenweise abzufertigen.
    Und mit

    VB.NET-Quellcode

    1. row.Split("|"c, 2).First()
    kommst du dann auf den Namen und kannst ihn der Listbox hinzufügen.
    Zeile#3 gibt einen Wert zurück. Und den musst Du der ListBox als Element hinzufügen: ListBox2.Items.Add(row.Split("|"c).First)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed Jou.
    @MisterRieus das hatten wir doch bereits in Post #2.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Oh man so einfach und ich komm nicht drauf. Hab alles probiert, aber das nicht. Danke nochmal an beide.
    So kommen wir zu dem 2. Problem.
    Jede Zeile aus der txt Datei besteht aus dem Namen und 7 Werten, die für Positionen stehen
    1. Wert = TW
    2. Wert = IV
    3. Wert = AV
    4. Wert = DM
    5. Wert = OM
    6. Wert = MS
    7. Wert = AS

    So jetzt gibt es z.b. den Button "TW" und eine Textbox Spielername und eine Textbox Spielerstärke.
    Wenn ich in der Listbox z.B. G.WAKABAYASHI angeklickt habe soll nun der angeklickte Name in die Textbox Spielername. Das ist ja kein Problem,
    aber es es überhaupt möglich, das man per Code dann den Namen in der txt Datei sucht und dann den 1. Wert nach dem Namen in die Textbox Spielerstärke einträgt?
    Der TW Button heißt immer TW , aber die anderen 6 Button heißen nicht immer gleich. Das würde ich dann mit einer IF Abfrage regeln.
    If Button.text = "IV" Then 2.Wert aus der txt Datei von dem angeklickten Spieler.

    Soll stell ich mir das vor. Ist das soweit möglich?
    So, Fan des Anime-Fußballs. Wie RfG so gerne und häufig schreibt: Bitte mal eine vollständige und belastbare Aufgabenbeschreibung erarbeiten und posten. Sonst hangeln wir uns hier von Mini-Problem zu Mini-Problem, geben/erarbeiten Teillösungen, nur um dann am Ende festzustellen, dass es eine einfache Lösung für alles gibt, wenn wir nur gewusst hätten, wie das ganze Vorhaben ausgesehen hätte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    MisterRieus schrieb:

    So kommen wir zu dem 2. Problem.
    haben wir nicht so gerne. ;(

    VaporiZed schrieb:

    Wie RfG so gerne und häufig schreibt: Bitte mal eine vollständige und belastbare Aufgabenbeschreibung erarbeiten und posten.
    Du hast mir die Tinte aus dem Füller genommen (oder so ähnlich).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!


    So sieht die Form aus.
    In Listbox1 werden Spielernamen mit diesem Code eingelsen:

    Quellcode

    1. Dim zeilen = IO.File.ReadLines("Spielerdatenbank.txt")
    2. For Each row In zeilen
    3. ListBox1.Items.Add(row.Split("|"c).First())
    4. Next


    Je nach Formation ändern sich die Button 1-11. Wobei Button1 immer TW heißt.
    Und dann gibt es noch die Positionen IV , AV , DM , OM , MS , AS.
    Über die Textbox Spielersuche kann ich nach Spielern suchen, die dann in der Listbox2 angezeigt werden. (Was auch schon funktioniert)
    Nun wählt man einen Spieler aus der Listbox2 und klickt auf die jeweilige Position an, wo dieser Spieler spielen soll.
    Textbox Spielername ist dann der angeklickte Eintrag aus Listbox2 und Textbox Stärke soll nun aus der Spieerdatenbank.txt Datei den Spieler suchen den man in der Listbox2 angeklickt hat
    und dann je nachdem auf welcher Position dieser Spieler spielen soll, soll der Wert aus der txt Datei in die Textbox Stärke eingetragen werden.
    Jeder Spieler kann auf allen Positionen spielen nur halt unterschiedlich gut.
    Die Spielerdatenbank.txt Datei ist wie folgt aufgebaut und jede Zeile ist immer gleich aufgebaut:
    G.WAKABAYASHI|96|34|23|13|23|32|32|

    Sprich erst der Name und dann die Stärke für die jeweilige Position in folgender Reihenfolge: TW , IV , AV , DM , OM , MS , AS
    Ich stell mir das so vor:
    If Button2 = "OM" Then
    Stärke = 5. Wert des ausgewähten Spielers aus der txt Datei.

    Mehr ist es eigentlich nicht :)
    Wenn das anders zu lösen ist, immer her damit bin offen für Verbesserungsvorschläge.
    @MisterRieus Nutze die Dateianhangs-Funktionalität des Forums:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Das würde ich z.B. statt mit 11 Buttons + TextBoxen mit einem DGV lösen. Dann kannst Du nämlich auch mit Indices arbeiten, was dazu führt, dass Du sagen kannst: Ok, wenn der 5 Button gedrückt wird, wird die 5. Spielerstärke dort eingetragen. Es wäre eigentlich noch sinnvoller gewesen, wenn Du statt 2-Buchstaben-Abkürzungen gleich schreibst: Torwart, Innenverteidigung, Außenverteidigung, ..., aber Du bist wahrscheinlich der Hauptuser Deines eigenen Programms, von daher: Deine Sache.
    Versuche Dir auch sinnvolle Namen für Deine CEs zu überlegen. Spätestens bei Button9 wirst Du Dir irgendwann denken: Welche Spielfeld-Position war das gleich?

    ##########

    Oder gleich statt Textdateien: ohne DB, aber mit tDS arbeiten. Nicht selten bleibt man auch ne ganze Weile dann tDS-only, weil es für lange Zeit ausreichend ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Jepp.
    Deine Anwendung ist eine Datenverarbeitung, da wirst du ohne typisiertes Dataset wohl kaum was brauchbares zustandebringen.
    Der View zB, den du anstrebst, ist ein typischer DetailView. Wenn man tDS verwendet, kann man sowas einfach zusammenklicksen - Code ist dafür nicht zu schreiben.

    Ist das wirklich alles, dass du SpielPositionen hast, und Spieler, und letztere auf erstere zuweisen willst?
    Oder kommt da noch was nach, etwa, dass das ganze auch für mehrere Spiele anwendbar ist, und ein Form fürs Eingeben von Spielern, ...
    Und löschen, Spielstärken ändern etc pp.

    Wie gesagt: typisiertes Dataset (alias "tDS") ist das Instrument für solche Anwendungen.
    Ok dann wars das wohl ^^
    Habe lange nicht mehr programmiert und war auch nie gut darin.
    Und von Dataset gar keine Ahnung.
    Dann muss ich schauen, ob ich das nicht doch so mit Textboxen und so hinbekomme,
    weil eigentlich müsste das doch auch gehen auch wenn die schlauere Variante die mit Dataset ist.
    Es muss doch folgendes möglich sein:
    Suche in txt Datei nach Textbox.text. So wenn dieser gefunden wurde kann man doch die Zeile ermitteln.
    Und dann per If Abfrage die Position klären und dann den entsprechenend Wert aus der Zeile mit dem Namen von der Textbox.
    So stell ich mir das einfach vor. Wie gesagt das Programm ist nur für mich.
    Und ich brauche nur den Wert aus der txt Datei für die Spielerstärke. Den Rest krieg ich alles hin.
    PS: Die Button und Boxen kriegen noch sinnvolle Namen, aber das kommt bei mir erst am Ende warum auch immer :)

    MisterRieus schrieb:

    Suche in txt Datei nach Textbox.text
    Nee. Pack lieber zu Programmbeginn die Daten in ne entsprechende Variable und verwende die im Programm:

    VB.NET-Quellcode

    1. Dim PlayerNamesList As New List(Of String)
    2. PlayerNamesList.AddRange(IO.File.ReadAllLines("DeineSpielernamenliste.txt"))

    Oder willst Du während der Laufzeit den Dateiinhalt verändern können?

    Am Ende die CE-Benennung? Bei Programmierung gibt es kein Ende. Irgendwo las ich mal: »›Ich bin fertig mit Programmieren.‹ ist wie ›Ich habe den Rasen zuendegemäht.‹«
    Und je später, desto mehr muss an Code angefasst werden. Klar, automatische Umbenennung geht oft, aber nicht immer.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ok das macht Sinn.
    Nein der Dateninhalt wird niemals während der Laufzeit geändert. Natürlich kann man vor dem Starten die txt Datei ändern.
    Ok dann werde ich die CE-Bennennung kurzfristig erledigen wobei das bei mir immer gut geklappt hat, aber für Tipps immer dankbar.
    So hab die Daten dann jetzt in eine entsprechende Variable gepackt und nun?
    Wie geht ich/man weiter vor um mein vorhaben zu erledigen?