Zeilen auslesen in label anzeigen

  • VB.NET

Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von Mokki.

    Zeilen auslesen in label anzeigen

    Hallo,

    ich hab ein Problem. Ich habe eine Richtextbox, und ein label.
    in die Richtextbox gebe ich eine Zahl ein. Dann soll per Klickevent auf dem Label eine Datei ausgelesen werden.
    Die Zahl steht am Anfag der Zeile und dann ein Satz dahinter, ich möchte mir alles anzeigen lassen bis auf die Zahl am Anfang.
    Funktioniert auch ganz gut, habe Trimm drin wegen den möglicherweise unterschiedlichen Leerzeichen in der eigetlichen Datei.
    aber nun zu meinem Problem. er liest manche Zeilen richtig aus und manchmal, z.b. bei 517 nimmt er 5179 und zeigt mir dann den text dazu an. nur mit ner 9 davor. Also 517 in der Textbox und die 9 dann im Text mit zum eingetlichen satz dazu. er zeigt mir die falsche zeile an. bei 511 funktiniert das tadellos.

    hier mal mein Code dazu, vielleicht habt ihr ne idee?

    VB.NET-Quellcode

    1. Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click
    2. Try
    3. For Each Line As String In IO.File.ReadAllLines("C:\blablabla.dat")
    4. Line = Line.TrimStart
    5. If Line.StartsWith(txtRSPR.Text) Then
    6. Label4.Text = Line.Replace(txtRSPR.Text, "")
    7. End If
    8. Next
    9. Catch ex As Exception
    10. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    11. End Try
    12. End Sub

    Gottric schrieb:

    manchmal, z.b. bei 517 nimmt er 5179
    Poste mal den Text, bei dem Dein Code nicht funktioniert.
    Das sind elementare Testsituationen.
    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 kann ich leider nicht, der genau Text ist Betriebsintern und kann ich in keinem Fall veröffentlichen.

    Ich kann es genauer beschrieben. Es sind Nummern von 1 bis 9999 hinter diesen Nummern steht ein Text, ca. 20 Zeichen.
    Es ist ne normale .dat-Datei, Leerzeichen sind nicht unterschiedlich gesetzt.

    Ich kann an morgen mal die Datei umschrieben bisschen zum testen halt. Aber heute schaffe ich das nicht mehr.

    Gottric schrieb:

    Betriebsintern
    Dann ersetze "Atomkraftwerk" durch "Zuckerfabrik" und so, mach einfach einen Text, der Deinen Effekt reproduziert.
    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!
    Ersetze in deinem obigen Code Zeile #5 wie folgt:

    VB.NET-Quellcode

    1. If txtRSPR.Text = String.Join("", line.TakeWhile(Function(n) "0123456789".Contains(n))) Then
    dann müsste das Ganze funktionieren, so ferne deine Lines folgendes Format mit beliebig voran gestellter Zahlen aufweisen '1234ein beliebiger Text' ...

    VB.NET-Quellcode

    1. Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click
    2. Try
    3. For Each Line As String In IO.File.ReadAllLines("C:\blablabla.dat")
    4. Line = Line.TrimStart
    5. If Line.StartsWith(txtRSPR.Text) Then
    6. Label4.Text = Line.Replace(txtRSPR.Text, "")
    7. End If
    8. Next
    9. Catch ex As Exception
    10. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    11. End Try
    12. End Sub


    So ist eine Zeile aufgebaut in der Datei die ich auslesen möchte:

    517 FOCUS BMW AUDI WAGEN ROT

    er nimmt dann aber die:

    5179 FOCUS BMW AUDI WAGEN BLAU

    es funktioniert ohne Probleme bei

    520 FOCUS BMW AUDI WAGEN GRÜN

    da Zeigt er mir genau das im Label an was ich will nämlich nur:

    FOCUS BMW AUDI WAGEN GRÜN

    Anbei: die Zahlen sind nicht fortlaufend in der Datei, manchmal fehlen ein paar. Aber dei greife ich ja durch den Fehlermeldung ab.

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

    achso, sorry. hab ich ja wieder Rückgänig gemacht weil es nciht funktioniert hat.

    VB.NET-Quellcode

    1. Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click
    2. Try
    3. For Each Line As String In IO.File.ReadAllLines("C:\Users...")
    4. Line = Line.TrimStart
    5. If Line.StartsWith(txtRSPR.Text) = CBool(String.Join("", CType(Line.TakeWhile(Function(n) "0123456789".Contains(n)), String()))) Then
    6. Label4.Text = Line.Replace(txtRSPR.Text, "")
    7. End If
    8. Next
    9. Catch ex As Exception
    10. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    11. End Try
    12. End Sub


    Ich nutze seit heute option strict on. Er schlug mir diese Umwandlungen vor.
    bringt aber die selbe Fehlermeldung wie als ich es noch auf off geschaltet hatte.

    Gottric schrieb:

    Er schlug mir diese Umwandlungen vor
    ???
    Versuche einmal folgende Testroutine, die bildet doch ab, was du möchtest?

    VB.NET-Quellcode

    1. Private Sub Test()
    2. Dim testList As New List(Of String)
    3. testList.Add("517 FOCUS BMW AUDI WAGEN ROT")
    4. testList.Add("5179 FOCUS BMW AUDI WAGEN BLAU")
    5. testList.Add("520 FOCUS BMW AUDI WAGEN GRÜN")
    6. For Each line In testList
    7. Dim i = String.Join("", line.TakeWhile(Function(n) "0123456789".Contains(n)))
    8. 'oder mit REGEX
    9. 'Dim i = Regex.Matches(line, "[0-9]{0,}")(0).ToString
    10. If i = "517" Then MessageBox.Show(line.Replace(i, ""))
    11. If i = "5179" Then MessageBox.Show(line.Replace(i, ""))
    12. If i = "520" Then MessageBox.Show(line.Replace(i, ""))
    13. Next
    14. End Sub
    Ich verstehe nicht was du damit meinst, versuch mal ne listbox zu erstellen und dann das ganze einzutragne und per button auszulöen.
    ist es so gedacht?


    Im Grunde genommen geht es darum dass er nur nach der Zahl in der Textbox sucht und nicht noch eingeständig ne Zahl dranhängt.

    VB.NET-Quellcode

    1. Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click
    2. Try
    3. For Each Line As String In IO.File.ReadAllLines("C:\Users\...")
    4. Line = Line.TrimStart
    5. If Line.StartsWith(txtRSPR.Text) = CBool(System.Text.RegularExpressions.Regex.Matches(Line, "[0-9]{0,}")(0).ToString) Then
    6. Label4.Text = Line.Replace(txtRSPR.Text, "")
    7. End If
    8. Next
    9. Catch ex As Exception
    10. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    11. End Try
    12. End Sub


    Über Regex zeigt er das gleiche Fehlerbild.
    er hängt eigenstänidg Zahlen dran, z.B. wenn ich nur 1 Schreibe in die Textbox macht er eigenstänidg 1967 draus und zeigt mir im label dann an:

    967 APFEL GRÜN BLAU EGAL

    obwohl in Zeile hinter der 1

    BIRNE GELB ROT SUPER

    steht

    Edit:
    gerade ausprobiert, wenn die Zahlen 4 stellig sind hat er keine ausfällt. er zeigt mir 1 zu 1 das an was ich will.
    ganz komsich

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

    Da wird ja auch keine Zahl drangehängt...
    Diese Testrourine soll dir doch nur demonstrieren, wie die vorderen Zahlen aus deinen Angaben (Lines-Einträge) extrahiert werden und anschliessend mit einen Textwert (sollte deiner Textboxeingabe entsprechen) vergleicht... Und da ist es jetzt wurscht, ob's jetzt um "517" oder "5179" geht - es wird jetzt immer richtig verglichen!
    Weil .StartsWith("517") mit "517 blablabla..." und mit "5179 blablabla" verglichen immer True zurückgibt...
    ok, das dacht ich mir.
    aber wie kann ich machen dass er nur explizit die Zahl sucht?
    Muss das Startswith raus? aber dann laufe ich ja gefahr wenn im Text 517Äpfel steht dass er mir dann das nimmt. Er muss aber immer an anfang mit der Zahl anfangen.

    Wenn er die nicht findet soll er einfach nichts ins Label schreiben. Oder halt nen Fehler bringen, egal.