Bestimmte Zeile der TXT lesen und in Labels anzeigen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Bestimmte Zeile der TXT lesen und in Labels anzeigen

    Hey zusammen

    Habe da mal wieder ein Frage.

    Ich habe eine *.txt in der zeilenweise eine Nummer steht und daneben ein Name sowie eine Anschrift, getrennt durch ein Leerzeichen
    Über Eingabe in einer Textbox wird geprüft ob diese Nummer in der *.txt vorhanden ist, dies mache ich so.

    Quellcode

    1. Dim txtdatei As String = IO.File.ReadAllText("DATEI.txt")
    2. If txtdatei.Contains(TextBox1.Text) Then


    Nun möchte ich das die Zeile, welche übereinstimmt mit der Eingabe in der Textbox auf drei Labels aufgeteilt wird, sprich Nummer, Name, Anschrift.

    Wer kann mir helfen? Habe da leichte Anlaufschwierigkeiten.

    Danke Vorab

    Otti schrieb:

    VB.NET-Quellcode

    1. Dim txtdatei As String = IO.File.ReadAllText("DATEI.txt")
    Wenn Du den Text zeilenweise einliest, sollte es klappen. allerdings musst Du da durch die Zeilen iterieren:

    VB.NET-Quellcode

    1. Dim lines As String() = IO.File.ReadAllLines("DATEI.txt")

    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

    Hey, kann dir glaub ich nicht richtig folgen.
    Habe es nun mal so versucht

    Quellcode

    1. ​For Each Zeile As String In System.IO.File.ReadAllLines("DATEI.txt")
    2. Dim Data() As String = Zeile.Split(" ")
    3. Dim Nummer As String = Data(0)
    4. Dim Name As String = Data(1)
    5. kartenummer.Text = Nummer
    6. Vorname.Text = Name
    7. Next


    allerdings wird mir immer die letzte Zeile aus der *.txt angezeigt.

    Was mach ich falsch?
    Ja sicher, Deine Bedingung aus Post#1 fehlt. Außerdem gehst Du nun alle Zeilen durch. Ohne Schleifenabbruch. Dadurch werden mit jedem Schleifendurchgang die Label-Inhalte überschrieben. Und am Ende ist eben der letzte Dateieintrag, der überig bleibt, weil dessen Daten in die Labels geschrieben werden und nicht mehr von anderen Daten quasi überschrieben wird.
    Was ist jetzt Dein Auffindkriterium? Schließlich können mehrere Personen den gleichen Namen haben (Hans Meier)
    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.

    Otti schrieb:

    Was mach ich falsch?
    Du weißt nicht, was Dein Code macht, und Du bist nicht bereit, den Fehler selbst zu finden.
    Fang an, Deinen Code zu debuggen:
    Debuggen, Fehler finden und beseitigen
    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!
    Nochemal:

    VaporiZed schrieb:

    Deine Bedingung aus Post#1 fehlt. Außerdem gehst Du nun alle Zeilen durch. Ohne Schleifenabbruch.
    In Post#3 ist keinerlei Abbruchbedingung (If ... Then Exit For) -> Code macht nicht, was Du willst.
    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.
    @Otti Offensichtlich bist Du zu faul, Deine Fehler selbst zu finden und lässt die Mitglieder vom Forum Deine Arbeit machen. :thumbdown:
    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!
    ch habe eine *.txt in der zeilenweise eine Nummer steht und daneben ein Name sowie eine Anschrift, getrennt durch ein Leerzeichen
    Über Eingabe in einer Textbox wird geprüft ob diese Nummer in der *.txt vorhanden ist, dies mache ich so.


    das hast du nicht zu ende gedacht
    zum Beispiel du suchst nach der Zahl 63 die am Anfang steht
    was machst du aber wenn in einer anderen Zeile innerhalb der Anschrift
    zum Beispiel.... Am Donnerweg 63 ...steht

    weil du Contains verwendest..

    VB.NET-Quellcode

    1. If txtdatei.Contains(TextBox1.Text) Then

    wird das nicht funktionieren

    Hallo zusammen

    Habe es nun so und funktioniert.

    Quellcode

    1. ​Dim Zeile As String = 0
    2. For Each Line As String In IO.File.ReadAllLines("DATEI.txt")
    3. If Line.Contains(TextBox1.Text) Then
    4. Dim parts() As String = Line.Split(" "c)
    5. Label1.Text = parts(0)
    6. Label2.Text = parts(1)
    7. Label3.Text = Zeile 'steht in Zeile
    8. End If
    9. Zeile += 1
    10. Next
    Kapier ich 3fach nicht.
    Statt wieder alle Zeilen durchzugehen, wäre es effizienter, vor dem End If zu schreiben: Exit For
    Warum verwendest Du ein For Each, wenn Du die Zeilen mitzählst? Dafür gibt es die normale For-Schleife.
    Warum zählst Du die Zeilen überhaupt mit? Laut Deiner Beschreibung ist die Zeilennummer am Anfang einer Zeile bereits in der Datei vorhanden.

    btw: bitte korrekte VB.NET-CodeTags verwenden!
    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.

    Otti schrieb:

    If Line.Contains(TextBox1.Text) Then


    Du prüfst hier auch ob das was in der Textbox steht auch nur darin enthalten ist was nicht heißt das es der ANFANG der Zeile ist.
    Du schreibst du gibst dort eine Nummer ein und checkst dann ob die in der Datei ist WAS aber wenn du 6 eingibst für die 6.Zeile
    aber in der Anschrift der Zeile 3 die Hausnummer 26 steht dann würde er dir hier TRUE zurück geben obwohl die Zeile 6 gar nicht vorhanden ist.

    Was passiert denn dann?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    Otti schrieb:

    Dim Zeile As String = 0
    Das tut richtig weh.
    Option Strict On!

    VB.NET-Quellcode

    1. Dim Zeile As Integer = 0
    2. For Each Line As String In IO.File.ReadAllLines("DATEI.txt")
    3. Zeile += 1
    4. If Line.StartsWith(TextBox1.Text & " ") Then
    5. Dim parts() As String = Line.Split(" "c)
    6. Label1.Text = parts(0)
    7. Label2.Text = parts(1)
    8. Label3.Text = Zeile.ToString() 'steht in Zeile
    9. Exit For
    10. End If
    11. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    petaod schrieb:

    Das tut richtig weh.
    Ja.
    Der @Otti hat ja erst 270 Posts im Forum, da isser bei Strict On noch nicht vorbeigekommen. :D
    Visual Studio - Empfohlene Einstellungen
    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!

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

    Hi Otti,

    (jetzt ist es doch eher eine "fertige" Lösung geworden und kein reiner Hinweis // ich denke Du kannst von meinem Beitrag etwas mit nehmen wenn Du dich etwas damit auseinandersetzt)

    Ich hab den Thread nicht wirklich durchgelesen, aber im Moment beschäftige ich mich auch damit Dateien in mein Programm einzulesen und hab dein Post als mein Training gesehen ;)
    Die Ausgangslage mit "Nummer Name Adresse" hab ich in "Nummer;Name;Adresse" umgeändert, ich weiß nicht wie das sonst gehen soll, da bei einer echten Adresse ja auch Leerzeichen drin sind??

    Auf der einen Seite ist mein Ansatz Overkill auf der anderen Seite noch viel zu wenig strikt was Fehlererkennung anbelangt. Auch der Einsatz von einem KlassenModel ist natürlich nicht nötig, aber auf der anderen Seite ist das ja gerade das was VB / C# etc. ausmacht.
    Ich hoffe, dass so zu sagen der Denkanstoß ist in die Objektorientierung einzusteigen.

    Winforms Project mit 1x Txtbx 1xButton 1xRichTextbx 3xLable (Code in Forms und eine Klasse MitgliedModel)


    Form Code (Achtung C#):
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. using System.Windows.Forms;
    11. namespace WinForms_DeserializeTxTFile
    12. {
    13. public partial class Form1 : Form
    14. {
    15. readonly string[] Lines;
    16. List<MitgliedModel> LstMitglieder = new List<MitgliedModel>();
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. ResetLables();
    21. //versuch die Datei VBParadis.txt zu laden // im selben Verzeichnis wie das Programm
    22. try
    23. {
    24. Lines = File.ReadAllLines(@"VBParadis.txt");
    25. foreach (var line in Lines)
    26. {
    27. //hier Separator eintragen im Moment "1;Meier;LangeStr. 45"
    28. var lineSingleWord = line.Split(';');
    29. MitgliedModel mitgliedModel = new MitgliedModel();
    30. if (lineSingleWord.Length == 3)
    31. {
    32. //Achtung falls keine Zahl als an erster Stelle steht -> Exception
    33. mitgliedModel.Nr = Int32.Parse(lineSingleWord[0]);
    34. mitgliedModel.Name = lineSingleWord[1];
    35. mitgliedModel.Adresse = lineSingleWord[2];
    36. LstMitglieder.Add(mitgliedModel);
    37. }
    38. else
    39. {
    40. MessageBox.Show("Zeile beinhaltet fehlerhafte Einträge!");
    41. }
    42. }
    43. }
    44. catch (Exception)
    45. {
    46. MessageBox.Show("Fehler beim Laden der Txt Datei!");
    47. }
    48. foreach (var mitglied in LstMitglieder)
    49. {
    50. RtxbsShowTxt.Text += $"{mitglied.Nr}\t{mitglied.Name}\n\t{mitglied.Adresse}\n\n";
    51. }
    52. }
    53. private void BtnStartSuche_Click(object sender, EventArgs e)
    54. {
    55. ResetLables();
    56. try
    57. {
    58. Int32.Parse(TxbxEingabe.Text);
    59. }
    60. catch (Exception)
    61. {
    62. MessageBox.Show("Keine Zahl eingetippt?");
    63. TxbxEingabe.Clear();
    64. return;
    65. }
    66. foreach (var mitglied in LstMitglieder)
    67. {
    68. if (mitglied.Nr == Int32.Parse(TxbxEingabe.Text))
    69. {
    70. LbNr.Text = mitglied.Nr.ToString();
    71. LbName.Text = mitglied.Name;
    72. LbAdresse.Text = mitglied.Adresse;
    73. }
    74. }
    75. }
    76. private void ResetLables()
    77. {
    78. //setz die Lables auf Ausgangsstellung --
    79. LbNr.Text = "--";
    80. LbName.Text = "--";
    81. LbAdresse.Text = "--";
    82. }
    83. }
    84. }​


    Code der Klasse (C#):
    Spoiler anzeigen

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace WinForms_DeserializeTxTFile
    7. {
    8. public class MitgliedModel
    9. {
    10. public int Nr { get; set; }
    11. public string Name { get; set; }
    12. public string Adresse { get; set; }
    13. }
    14. }



    Jetzt nochmal als VB Code ist jedoch nur mit converter.telerik.com konvertiert.

    Code Forms in VB:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.ComponentModel
    4. Imports System.Data
    5. Imports System.Drawing
    6. Imports System.IO
    7. Imports System.Linq
    8. Imports System.Text
    9. Imports System.Threading.Tasks
    10. Imports System.Windows.Forms
    11. Namespace WinForms_DeserializeTxTFile
    12. Public Partial Class Form1
    13. Inherits Form
    14. ReadOnly Lines As String()
    15. Private LstMitglieder As List(Of MitgliedModel) = New List(Of MitgliedModel)()
    16. Public Sub New()
    17. InitializeComponent()
    18. ResetLables()
    19. Try
    20. Lines = File.ReadAllLines("VBParadis.txt")
    21. For Each line In Lines
    22. Dim lineSingleWord = line.Split(";"c)
    23. Dim mitgliedModel As MitgliedModel = New MitgliedModel()
    24. If lineSingleWord.Length = 3 Then
    25. mitgliedModel.Nr = Int32.Parse(lineSingleWord(0))
    26. mitgliedModel.Name = lineSingleWord(1)
    27. mitgliedModel.Adresse = lineSingleWord(2)
    28. LstMitglieder.Add(mitgliedModel)
    29. Else
    30. MessageBox.Show("Zeile beinhaltet fehlerhafte Einträge!")
    31. End If
    32. Next
    33. Catch __unusedException1__ As Exception
    34. MessageBox.Show("Fehler beim Laden der Txt Datei!")
    35. End Try
    36. For Each mitglied In LstMitglieder
    37. RtxbsShowTxt.Text += $"{mitglied.Nr}\t{mitglied.Name}\n\t{mitglied.Adresse}\n\n"
    38. Next
    39. End Sub
    40. Private Sub BtnStartSuche_Click(ByVal sender As Object, ByVal e As EventArgs)
    41. ResetLables()
    42. Try
    43. Int32.Parse(TxbxEingabe.Text)
    44. Catch __unusedException1__ As Exception
    45. MessageBox.Show("Keine Zahl eingetippt?")
    46. TxbxEingabe.Clear()
    47. Return
    48. End Try
    49. For Each mitglied In LstMitglieder
    50. If mitglied.Nr = Int32.Parse(TxbxEingabe.Text) Then
    51. LbNr.Text = mitglied.Nr.ToString()
    52. LbName.Text = mitglied.Name
    53. LbAdresse.Text = mitglied.Adresse
    54. End If
    55. Next
    56. End Sub
    57. Private Sub ResetLables()
    58. LbNr.Text = "--"
    59. LbName.Text = "--"
    60. LbAdresse.Text = "--"
    61. End Sub
    62. End Class
    63. End Namespace​


    Code der Klasse mit Namen MitgliedModel in VB:

    VB.NET-Quellcode

    1. ​Imports System
    2. Imports System.Collections.Generic
    3. Imports System.Linq
    4. Imports System.Text
    5. Imports System.Threading.Tasks
    6. Namespace WinForms_DeserializeTxTFile
    7. Public Class MitgliedModel
    8. Public Property Nr As Integer
    9. Public Property Name As String
    10. Public Property Adresse As String
    11. End Class
    12. End Namespace



    Sieht ja jetzt doch nach "Wall of Text" aus ;) ist aber einfachste Kost :P LG Nogood
    Bilder
    • VB.jpg

      26,97 kB, 477×544, 16 mal angesehen
    hier noch eine variante

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim Elements() As String = IO.File.ReadAllLines("E:\Searchnumbers.txt")
    3. Dim UserAddress As String = Elements.First(Function(line As String) line.StartsWith("667"))
    4. Label1.Text = UserAddress.Split(" "c)(0)
    5. Label2.Text = UserAddress.Split(" "c)(1)
    6. Label3.Text = UserAddress.Split(" "c)(2)
    7. End Sub


    aber wie prüfst du ob eine Nummer schon vorhanden ist, User die neue Datensätze
    eingeben sollten eine Meldung bekommen das Nummer '667' schon angelegt ist.

    selbst mit EXIT FOR oder mit meiner Anwesiung oben wird ja immer nur der 'erste Fund' gemeldet
    @Kasi Hier noch eine Variante mit nur einem Split:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim Elements() As String = IO.File.ReadAllLines("E:\Searchnumbers.txt")
    3. Dim UserAddress As String = Elements.First(Function(line As String) line.StartsWith("667"))
    4. Dim parts As String() = UserAddress.Split(" "c)
    5. Label1.Text = parts(0)
    6. Label2.Text = parts(1)
    7. Label3.Text = parts(2)
    8. 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!
    Ich glaube, wir sollten uns nicht länger um saubere oder elegante Lösungen bemühen.
    Der TE schrieb letzten Sonntag

    Otti schrieb:

    Habe es nun so und funktioniert.
    und dabei scheint er es wohl belassen zu wollen.
    Ich für meinen Teil kann damit leben.
    Er programmiert ja nicht für mich.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Kasi schrieb:

    aber auch die Variante prüft nicht
    Hat sie auch nicht vor.
    Ich gab Dir lediglich einen Clean-Code-Tipp.
    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!