VB : Anfänger braucht Hilfe beim Einlesen einer Text-Datei

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von matschpatsch.

    VB : Anfänger braucht Hilfe beim Einlesen einer Text-Datei

    Hallo, ich steh vor einem Problem, das ich momentan trotz intesiver google-Bemühung nicht lösen kann.

    Aufgabenstellung: Eine Textdatei zeilenweise in eine Listbox einlesen, wenn die Zeile den string 2014 beinhaltet.
    So schaut's momentan bei mir aus:


    VB.NET-Quellcode

    1. Dim sr As New StreamReader("C:\Users\Matschpatsch\Documents\Leuchtentypenschild.txt")
    2. Do Until sr.EndOfStream
    3. Dim zeile As String = sr.ReadLine
    4. If zeile.Substring(6, 4) = "2014" Then
    5. lstAusgabe.Items.Add(zeile)
    6. End If
    7. Loop


    Leider bricht die Schleife ab sobald eine Leerzeile vorkommt.
    Ohne die den If-Block wird die Textdatei problemlos eingelesen.

    Danke für die Hilfe
    Bilder
    • leerzeile.JPG

      21,87 kB, 516×90, 84 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „matschpatsch“ ()

    Ja weil der Substring nicht erfüllt werden kann, da keine 4 bzw. 6 Buchstaben vorhanden sind, die er Splitten kann
    --> Fehler --> Abbruch der Schleife

    Versuchs mit

    Visual Basic-Quellcode

    1. If Zeile.contains"2014"
    2. Aktion
    3. End If


    Oder If Abfrage nur Ausführen, wenn Zeile.count >= 6


    Oder einfach mit nem try-Block

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

    Hy, das geht mit

    Visual Basic-Quellcode

    1. Dim reader as new Io.StreamReader("Pfad")
    2. While reader.peek <>-1
    3. String line = reader.ReadLine()
    4. End While
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Hallo und mein Dank an Euch beide.
    Hab die contains-Methode(weil auf Anhieb verständlicher) verwendet und es funktioniert.

    Wobei ich immer noch nicht verstehe, warum meine substring-methode nicht funktioniert hat.
    contains wird doch auch nicht erfüllt *verwirrt bin*

    mfg

    Stefan
    @matschpatsch hast du mal geschaut was in deinem Substring steht? ".201", "014 " oder "2014"
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    das mit contains ist schön, aber was ist wenn du einen Zeichenkette hast wo drinnen steht A142014587 z.b.: dann würde auch der Code ausgeführt obwohl der Substring z.b. nicht erfüllt wird. Es würde sich eignen mit

    Visual Basic-Quellcode

    1. if String.IsNullOrEmpty(zeile) = False Then
    2. ' Dein Code
    3. End If


    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Willkommen im Forum. :thumbup:

    matschpatsch schrieb:

    sobald eine Leerzeile vorkommt.
    Zunächst steht Dein Code in der Form_Load, da sollte er nicht stehen, sonst hättest Du eine IndexOutOfRange-Exception bekommen. Pack ihn in die Form1_Shown-Prozedur:
    Wenn der String leer ist, kannst Du nicht am Index 6 beginnend was tun.

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    2. For Each zeile In IO.File.ReadLines("")
    3. If zeile.Length > 10 AndAlso zeile.Substring(6, 4) = "2014" Then
    4. lstAusgabe.Items.Add(zeile)
    5. End If
    6. Next
    7. End Sub
    oder, wenn die Position egal ist:

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    2. For Each zeile In IO.File.ReadLines("")
    3. If zeile.Contains("2014") Then
    4. lstAusgabe.Items.Add(zeile)
    5. End If
    6. Next
    7. End Sub
    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!
    oder eben wie schon oben erwähnt prüfen ob der String leer ist

    Visual Basic-Quellcode

    1. if String.IsNullOrEmpty(zeile) = False Then
    2. ' Dein Code
    3. End If


    somit wird keine leere zeile geprüft.
    (erwähne es nochmal da weitere Posts nach dem Edit gekommen sind)
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    @Andy16823

    das hattest du schon gepostet.
    Der Code von @RodFromGermany fängt aber zusätzlich noch ab falls eine Zeite nur 8 Zeichen enthällt. Das würde nämlich bei deiner Version weiterhin vor die Wand fahren.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    matschpatsch schrieb:

    Wobei ich immer noch nicht verstehe, warum meine substring-methode nicht funktioniert hat.

    Das hängt davon ab wie die jeweilige Methode mit fehlenden Daten bzw. "Nichterfüllung" umgeht. Im Zweifel schaut man in die Online-Hilfe (Cursor auf Methoden-Name und dann F1 drücken).

    String.Contains() gibt dir einen Boolschen Wert zurück, der dir mitteilt, ob der übergebene Text in deinem String enthalten ist oder nicht. Ist der String leer, enthält er den Text logischerweise nicht, also gibt die Funktion den Wert False zurück, den du z.B. per If-Abfrage auswerten kannst.

    String.Substring() gibt dir einen String zurück, und zwar den, der im ausgehenden String an einer bestimmten Position beginnt und eine bestimmte Länge hat. Position und Länge definierst du per Methoden-Parameter. Und hier sollte man genau wissen, was passiert, wenn der String von vornherein nicht lang genug ist, um 4 Zeichen von Position 6 an extrahieren zu können. Die Online-Hilfe verrät dir hier, dass in diesem Fall ein Fehler aufgeworfen wird (eine Ausnahme bzw. "Exception" tritt auf). Ausnahmen bedeuten immer eine Unterbrechung des linearen Programmablaufs. In deinem Fall scheint dein Codeschnipsel zudem im Load-Event der Form ausgeführt zu werden, denn hier gibt es die Besonderheit, dass Exceptions, die darin (oder darin verschachtelt aufgerufenen Methoden) ausgelöst und nicht abgefangen werden, unbemerkt verschluckt werden, und zwar in der Art, dass die gesamte Event-Methode einfach "abbricht" und du es nicht mitbekommst. Darum wirkt es so, als würde an der Stelle deine Do-Schleife einfach beendet, wenn eine Leerzeile gelesen wurde.

    Ich habe mir aus dem Grund übrigens angewöhnt, im Load-Event einer Form grundsätzlich einen Try-Catch-Block zu verwenden, damit ich immer mitbekomme, wenn während des Ladens einer Form eine Exception auftritt.


    Nachtrag:
    Contains hat natürlich den evtl. nicht gewünschten Nebeneffekt, dass du auch dann True zurückbekommst, wenn die Zeichenfolge "2014" nicht an Position 6, aber an anderer Stelle deiner gelesenen Zeile auftaucht. Wenn du das ausschließen willst, wäre eine Alternative die Funktion IndexOf().

    VB.NET-Quellcode

    1. If zeile.IndexOf("2014") = 6 Then
    2. '...
    3. End If

    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Erstmal Danke für die vielen Antworten.

    *Gelöscht*

    Und vielen Dank für die verständliche Erklärung.

    Die kopier ich mir und hebs mir gut auf ;)
    mfg

    Stefan

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