Lesen von .txt Datei und trennen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 181 Antworten in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    Lesen von .txt Datei und trennen

    Hallo ich bin neu hier im Forum und auch neu im programmieren (falls ich meine Skills überhaupt so nennen darf) :D

    Ich komme nicht dahinter das System zu verstehen wie man eine .txt Datei ausliest welche mehrere Einträge in einer Zeile hat und diese auch irgendwie in mein Projekt einzubinden.

    .txt Datei:
    Test,1
    Forum,2
    SKY,3
    Paradise,4

    Ich möchte den ersten Eintrag und den zweiten trennen wie es bereits in der .txt ist jedoch muss ich mit beiden Werten weiter arbeiten können und muss diese definieren.

    Der Sinn dahinter ist wenn ich in der ComboBox den ersten Eintrag vor dem Komma auswähle soll der zweite Eintrag ausgegeben werden.

    Vielleicht kann mir ja jemand helfen.

    Vielen Dank
    @MrSKY Willkommen im Forum. :thumbup:
    Text-Dateien liest das Framework in einem Rutsch ein.
    Du arbeitest zeilen-orientiert, also lesen wir alle Zeilen Deiner Daiei ein:

    VB.NET-Quellcode

    1. Dim lines() = System.IO.File.ReadAllLines(PFAD_ZU_DEINER_DATEI)
    Du bekommst ein Array, wo jede Zeile Deiner Datei in einem Element des Arrays liegt.
    Wenn Du nun die Zeilen in sich trennen willst, musst Du sie splitten. Den ersten Teil packen wir in eine ComboBox, das mit dem zweiten Teil kriegst Du allein raus:

    VB.NET-Quellcode

    1. For Each line In lines
    2. Dim parts() = line.Split(","c)
    3. ComboBox1.Items.Add(parts(0))
    4. Next
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das auslesen der .txt Datei war bei mir sehr ähnlich aufgebaut habe mich dazu auf Google schlau gemacht.

    Dein Code mit dem splitten scheint zu funktionieren jedoch bin ich leider nicht so weit um diesen auch richtig zu verstehen.

    Wenn ich z.b. den zweiten Teil also den zweiten Eintrag nach dem Komma wo anders einfügen will würde ich:

    VB.NET-Quellcode

    1. ComboBox_EQWItem.Items.Add(parts(1))


    machen und genau da gibt es dann wieder ein kleines Problem wie kann man solche Funktionen außerhalb eines "Private Subs" verwenden oder geht das bereits schon?
    Denn ich erhalte den Fehler "parts" wurde nicht deklariert wenn ich den zweiten Teil versuche auszulesen und einzufügen.

    MrSKY schrieb:

    Denn ich erhalte den Fehler "parts" wurde nicht deklariert
    Dann musst Du das in derselben Sub machen oder die betreffende Variable aus der Prozedur in die Klasse verschieben.
    Von diesen beiden Varianten bevorzuge ich die erstere, es sei denn, Du brauchst die Zeilen bzw. parts noch zu einem späteren Zeitpunkt.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    *unnötiges Vollzitat entfernt*

    Alles klar das ergibt einen Sinn auch im selben Sub habe ich jedoch den Fehler das "parts" nicht deklariert wurde.

    Um was es genau geht:
    Ich habe eine ComboBox dort soll er den ersten Eintrag auslesen was nun funktioniert jedoch möchte ich in einer TextBox den zweiten Eintrag ausgeben/schreiben lassen wenn z.B. der erste Eintrag ausgewählt wird in der ComboBox soll in der TextBox der zweite Eintrag ausgegeben werden.

    Edit:
    Wobei nein ich kann das nicht in das jeweilige Sub einfügen weil ich vor der ComboBox noch ein paar CheckBoxen habe und je nachdem was man dort anklickt soll in der ComboBox die Datei ausgelesen werden und ausgegeben werden.
    Ich weiß nicht ob das gut ist aber mein Plan war bei jeder CheckBox eine .txt Datei auslesen zu lassen da ich mehrere verwenden muss.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @MrSKY Zunächst einmal: Unterlass es bitte, komplette Posts über den Deinen zu zitieren!
    ====
    Also:
    Du brauchst in der Klasse , nicht in der Sub, ein Feld, in dem die zweiten Parts des Datei-Inhalts gespeichert werden.
    Wenn Du dann in der ComboBox rumklickerst, bekommst Du das SelectedIndexChanged-Event. Dieses abonnierst Du (Doppelklick auf die ComboBox im Designer), liest den .SelectedIndex der ComboBox aus, greifst mit diesem Indes in das Feld der zweiten Parts und zeigst dies an.
    Empfehlenswert ist hier eine List(Of String) zu verwenden, da hier die Anzahl der Einträge dynamisch ist.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Also:
    Du brauchst in der Klasse , nicht in der Sub, ein Feld, in dem die zweiten Parts des Datei-Inhalts gespeichert werden.
    Empfehlenswert ist hier eine List(Of String) zu verwenden, da hier die Anzahl der Einträge dynamisch ist.


    Ich verstehe ein Teil deines Beitrages damit kann ich was anfangen mit dem Teil jedoch leider nicht.
    Wie bzw wo füge ich den Code hinzu damit es nicht im Sub sondern in einer Klasse ist?
    Das mit List(Of String) verstehe ich leider auch nicht aber werde mich gleich darüber schlau machen.
    Macht es Sinn mehrere einzelne Checkboxen zu haben um das zu erreichen was ich will?
    Kann ich diese nicht irgendwie zusammen packen?

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

    @MrSKY Du kommst vom hundertsten ins tausendste.
    Überlege Dir zunächst genau, was Du willst.
    Schreib eine belastbare Aufgabenstellung, die können wir dann schrittweise abarbeiten.
    Belastbar bedeutet hier, dass, wenn ein Punkt abgearbeitet ist, es keine weiteren Fragen und Unter-Aufgabenstellungen gibt.
    Wenn während der Implementierung Probleme auftreten, werden die selbstverständlich geklärt.
    Treten weitere Wünsche bezüglich des Funktionsumfangs auf, verschieb die in die nächste Version.
    Klar kann man mit CheckBoxen das Verhalten eines Ablaufs steuern.
    Nimm dies als Ausgangspunkt für Dein Projekt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Part2 As New List(Of String)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim lines() = System.IO.File.ReadAllLines("d:\temp\test.txt")
    5. Part2.Clear()
    6. ComboBox1.Items.Clear()
    7. For Each line In lines
    8. Dim parts() = line.Split(","c)
    9. ComboBox1.Items.Add(parts(0))
    10. Part2.Add(parts(1))
    11. Next
    12. ComboBox1.SelectedIndex = 0
    13. End Sub
    14. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    15. If (ComboBox1.SelectedIndex >= Part2.Count) Then
    16. Return
    17. End If
    18. Label1.Text = Part2(ComboBox1.SelectedIndex)
    19. End Sub
    20. End Class
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Alles klar dann schreib ich eben was ich genau brauche.

    Ich habe mehrere einzelne CheckBoxen, wobei nur eine davon zugleich ausgewählt sein soll ->
    nachdem soll in der ComboBox der erste Eintrag einer .txt ausgelesen werden. ->
    darauf folgt noch eine ComboBox wo man einen "fix" eingetragenen Wert bzw. Eintrag auswählen kann ->
    Resultierend aus der Auswahl der CheckBox bekommt man die jeweilige .txt ausgelesen (erster Eintrag der .txt) ->
    danach wählt man noch in der darauffolgenden CheckBox noch den "Fixwert" bzw Inhalt auswählt ->
    Alles außer die CheckBox soll in der TextBox ausgegeben werden dort jedoch der zweite Eintrag der geladenen .txt Datei der jeweils vorher ausgewählten CheckBox. ->
    Ändert man irgendwas z.b. man wählt ne andere CheckBox oder sonst was davon soll die TextBox "Realtime" aktualisiert werden mit der Ausgabe falls dies Möglich ist.

    LG

    MrSKY schrieb:

    CheckBoxen, wobei nur eine davon zugleich ausgewählt sein soll
    Dafür gibt es RadioButton.
    Jewiss ist das möglich.
    Allerdings empfehle ich Dir, etwas langsamer an Deine Probleme heranzugehen und dies gründlicher zu tun, das ist besser für den Lerneffekt.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    MrSKY schrieb:

    Alles klar dann schreib ich eben was ich genau brauche.
    Ich sags gleich: Das verständlich zu formulieren ist mit das schwierigste am Programmieren überhaupt.

    So auch hier noch nicht gelungen (ich machs in Häppchen):

    MrSKY schrieb:

    Ich habe mehrere einzelne CheckBoxen, wobei nur eine davon zugleich ausgewählt sein soll ->
    nachdem soll in der ComboBox der erste Eintrag einer .txt ausgelesen werden. ->
    Gut, du hast ein paar Checkboxen, die im Grunde wie eine Gruppe RadioButtons funzen sollen - versteh ich.
    aber "nachdem soll in der ComboBox der erste Eintrag einer .txt ausgelesen werden"??
    In einer Combobox kann man keine .txt auslesen.
    In eine Combo kann man etwas einlesen, und wenns eingelesen ist, kann man etwas daraus auswählen.
    Was also meinst du: einlesen oder auswählen, oder noch was anderes?

    MrSKY schrieb:

    Klasse statt Sub gemeint
    Sub:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim lines() = System.IO.File.ReadAllLines("d:\temp\test.txt")
    4. End Sub
    5. End Class
    Klasse:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim lines() As String
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. lines = System.IO.File.ReadAllLines("d:\temp\test.txt")
    5. End Sub
    6. End Class
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    MrSKY schrieb:

    ERD schrieb:

    Was also meinst du: einlesen oder auswählen, oder noch was anderes?

    Ich mein natürlich das letztere einlesen und dann auswählen.
    Schau meine Frage nochmal genau an:
    Es ist eine Entweder-Oder-Frage - kannst du das erkennen?

    Schau deine Antwort an.
    Es ist -äh- beides?
    Und was mit "das letztere" gemeint sein mag ist auch völlig unklar.

    Also deine Antwort ergibt keinen Sinn - wie soll dir da geholfen werden?

    Und bitte: Diesen Post nicht als Vollzitat zitieren. Wenn du daraus zitieren willst, dann zitier die Stellen, die du zitieren willst - nicht den ganzen Post!!

    ErfinderDesRades schrieb:

    Schau deine Antwort an.
    Es ist -äh- beides?
    Und was mit "das letztere" gemeint sein mag ist auch völlig unklar.

    Du hast weiter oben geschrieben in einer Combo kann was etwas einlesen und dann auswählen das ist doch der Sinn oder nicht das habe ich mit beides gemeint.
    Nach dem auswählen einer Check soll von einer .txt der erste Eintrag ausgelesen werden und dieses in die Combo einlesen damit man es auswählen kann.

    ErfinderDesRades schrieb:

    hast du schon ein bischen Code als Vorlage? Dann kann man den verbessern, bis er tut, wasser soll.


    Ich habe eben mit Hilfe von RodfromGermany's Post weiter oben eine Klasse erstellt.

    VB.NET-Quellcode

    1. Dim lines() As String
    2. Private Sub GunaCheckBox_EQWSword_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox_EQWSword.CheckedChanged
    3. lines = System.IO.File.ReadAllLines("Test.txt")
    4. For Each line In lines
    5. Dim parts() = line.Split(","c)
    6. ComboBox_EQWItem.Items.Add(parts(0))
    7. Next
    8. End Sub


    Ob das richtig ist weiß ich leider nicht jedoch gibt VS keinen Fehler aus und nachdem ich die jeweilige Checkbox ausgewählt habe liest es mir die jeweilige .txt in die ComboBox ein.
    Ist der Code oben richtig nun sodass ich den ersten Eintrag der .txt mit (parts(0)) oder wie auch immer auch außerhalb nur dieser Sub verwenden kann?

    ErfinderDesRades schrieb:

    Du kannst die erste Zeile der .txt verwenden: lines(0)

    Ich brauche aber beide Einträge der ersten Zeile getrennt sodass ich diese im Code weiter verwenden kann.

    VB.NET-Quellcode

    1. TextBox_EQWCommand.Text = "$ci " + ComboBox_EQWItem.Items.Add.Text + ComboBox_EQWRarity.Text + ComboBox_EQWUpgrade.Text



    statt ComboBox_EQWItem.Items.Add.Text würde ich gerne je nach auswähltes Item in der ComboBox den zweiten Eintrag aus der .txt in die TextBox ausgeben lassen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MrSKY“ ()