frei Zahlen in Textdatei finden

  • VB.NET

Es gibt 70 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Gottric schrieb:

    So, wie sieht das aus?

    VB.NET-Quellcode

    1. Dim lines = File.ReadAllLines(Pfadprg21prg + "prg__dir.dat")
    2. Dim numberList = New List(Of Integer) 'hier kommt die richtige Liste!
    3. For Each line In lines
    4. Dim sNummer = line.Split(" "c)(1)
    5. Dim Newlist = Integer.Parse(sNummer)
    6. numberList.Add(Newlist)
    7. Next
    8. Dim AlleNummern As IEnumerable(Of Integer) = Enumerable.Range(1, 9999)
    9. Dim except = AlleNummern.Except(numberList)
    10. For Each Zahl In except
    11. ListBox1.Items.Add(Zahl)
    12. Next


    ist müüste jetzt noch testen aber glaube das ist es oder?
    Jo - fast so habich mir das vorgestellt.
    Nur eins ist gradezu ärgerlich: Newlist - ist das eine Liste?? Wenn nein - wieso heisst das schon wieder wie etwas, was es garnet ist??
    Ich sag dir auch vor, was es ist: Es ist eine Nummer. Und es kommt ja auch in die Numberlist - guck einfach mal hin!
    Also ich meine
    Nomen est Omen!
    wirklich ernst, und bestimmt 20 Posts dieses Threads hingen im Grunde nur an falscher Benamung: Du hattest etwas "Liste" genannt, was keine Liste war, und konntest deswegen nicht drauf kommen, dass eine Liste fehlte - eine richtige.
    Und nach dieser Erfahrung verzapfste gleich dasselbe nochmal, sogar mit demselben Begriff "Liste".
    Glaub mir: so wird das nix. (Und das hat auch nix mit besonderem Fachwissen zu tun etc.)
    Guten Morgen euch allen, @ErfinderDesRadesvergleiche bitte meinen letzten Code aus post 39. Da habe ich es schon korregiert.

    @vb1693
    siehe bitte Dateianhang. bei mir schreibt er die erste Zahl der ersten Zeile der Datei die ich einlese in sNummer. Das ist soweit ich das verstehe richtig. oder nicht?

    noch ne andere Frage, soll ich für die nächste frage mit dem löschen eine neues thema aufmachen oder behandeln wir das hier?
    Bilder
    • Unbenannt.png

      29,27 kB, 960×540, 76 mal angesehen
    Ja, alle beginnen mit einem Leerzeichen. Ist das wichtig?

    Datei 1:
    1 Gelb (1 Leerzeichen davor)
    2 Grün (1 Leerzeichen davor)
    3 Orange (1 Leerzeichen davor)
    4 irgendwas (1 Leerzeichen davor)
    5 irgendwas (1 Leerzeichen davor)
    6 irgendwas (1Leerzeichen davor)
    7 irgendwas (1 Leerzeichen davor)
    8 irgendwas (1 Leerzeichen davor)
    10 irgendwas (1 Leerzeichen davor)
    11 irgendwas (1 Leerzeichen davor)
    12 irgendwas (1 Leerzeichen davor)
    13 irgendwas (1 Leerzeichen davor)
    14 irgendwas (1 Leerzeichen davor)
    15 irgendwas (1 Leerzeichen davor)
    101 irgendwas (1 Leerzeichen davor)
    10001 irgendwas (1 Leerzeichen davor)
    9999 irgendwas (1 Leerzeichen davor)

    Datei 2:

    1 Gelb (4 Leerzeichen davor)
    2 Grün (4 Leerzeichen davor)
    3 Orange (4 Leerzeichen davor)
    4 irgendwas (4 Leerzeichen davor)
    5 irgendwas (4 Leerzeichen davor)
    6 irgendwas (4 Leerzeichen davor)
    7 irgendwas (4 Leerzeichen davor)
    8 irgendwas (4 Leerzeichen davor)
    10 irgendwas (3 Leerzeichen davor)
    11 irgendwas (3 Leerzeichen davor)
    12 irgendwas (3 Leerzeichen davor)
    13 irgendwas (3 Leerzeichen davor)
    14 irgendwas (3 Leerzeichen davor)
    15 irgendwas (3 Leerzeichen davor)
    101 irgendwas (2 Leerzeichen davor)
    10001 irgendwas (1 Leerzeichen davor)
    9999 irgendwas (1 Leerzeichen davor)
    99999 leer (0 Leerzeichen davor)(kommt aber auch nur 1mal in der Datei vor und nur in Datei 2

    Auf die zweite Datei die ich einlesen will habe ich es noch nicht angewand.

    Edit: gerade auch auf Datei 2 angewand. also bei mir arbeitet es so wie es soll.
    wenn Ihr nen Fehler habt der für mich jetzt nicht ersichtlich ist bitte melden. :)

    Also wenn ich nen Haltepunkt einfüge bei Datei2 ist sNummer leer. aber warum ist dann die eingelesene Datei in der Listbox richtig?

    Vom logischen her müsste ich ja erstmal alles auf eine line bringen. habe jetzt

    VB.NET-Quellcode

    1. Dim sNummer = line.TrimStart.Split(" "c)(0)
    angewendet und splitte dann nicht mehr mit

    VB.NET-Quellcode

    1. Dim sNummer = line.TrimStart.Split(" "c)(1)
    sondern mit Null. Habe ich das richtig verstanden?

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

    Hallo,

    Ich wusle hier jetzt nur durch, um meinen Senf dazuzugeben. :thumbup:
    Ich würde ja zu einem endlichen Automaten greifen, der für sowas ja geschaffen wurde: Regex mit ^[1-9]\d?\d?\d?(?=\D) als Pattern liefert alle Zahlen am Zeilenanfang, die einschliesslich zwischen 1 und 9999 sind und denen ein Zeichen folgt, welches keine Zahl ist.

    Grüsse,

    Higlav
    RegEx ist auch eine Möglichkeit :) - wer aber RexgEx nicht so sehr mag, der kann's auch so wiederum umsetzen:

    VB.NET-Quellcode

    1. Dim result = String.Join("", line.TrimStart.TakeWhile(Function(n) "0123456789".Contains(n)))
    hatte ich in Post #13 schon einmal vorgeschlagen...
    Oh sorry, ich war so vertieft ins abändern. hab eure Post garnicht gesehen :)
    ist so wie ich es jetzt gemacht habe nicht richtig?

    VB.NET-Quellcode

    1. Dim sNummer = line.TrimStart.Split(" "c)(0)


    in wie fern unterscheidet sich das von deinem

    VB.NET-Quellcode

    1. Dim result = String.Join("", line.TrimStart.TakeWhile(Function(n) "0123456789".Contains(n)))


    Edit: wenn ich das einsetzte sagt er mir Option Strict ON lässt keine impliziten kovertierungen von IE Numberal fo Char zu String zu.

    Mich würde interessieren ob mein gedankengang mit .Trimstart richtig ist und dann nach (0) zu splitten.

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

    Gottric schrieb:

    .Trimstart
    brauchst Du nicht, wenn Du richtig splittest:

    VB.NET-Quellcode

    1. Dim line = " 1 Gelb "
    2. Dim sNummer = line.Split({" "c}, StringSplitOptions.RemoveEmptyEntries)(0)
    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!

    Gottric schrieb:

    wenn ich das einsetzte sagt er mir Option Strict ON lässt keine impliziten kovertierungen von IE Numberal fo Char zu String zu.
    keine Ahnung - bei mir funzt diese Zeile (vlt. hast du eine niedrigere FW-Version?)

    Gottric schrieb:

    in wie fern unterscheidet sich das von deinem
    Die erste löst auch solche Eintragszeilen auf, wenn so Ähnliches vorkommen sollte...: " 123!99 Irgendwas..." => Ergebnis:123
    @VB1963 ich schreibe auf FW 3.5

    VB.NET-Quellcode

    1. Private Sub btnprüfen_Click(sender As Object, e As EventArgs) Handles btnprüfen.Click
    2. If ComboBox1.SelectedIndex = -1 Then
    3. MsgBox("Es muss ein Roboter ausgewählt werden um die verfügbarkeit zu prüfen!", MsgBoxStyle.Critical, "Fehler")
    4. Return
    5. End If
    6. Dim lines = File.ReadAllLines(Pfadprg21prg + "prg__dir.dat")
    7. Dim numberList = New List(Of Integer)
    8. For Each line In lines
    9. Dim sNummer = line.Split({" "c}, StringSplitOptions.RemoveEmptyEntries)(0)
    10. 'Dim sNummer = line.TrimStart.Split(" "c)(0)
    11. Dim result As Integer
    12. If Integer.TryParse(sNummer, result) Then numberList.Add(result)
    13. Next
    14. Dim AlleNummern As IEnumerable(Of Integer) = Enumerable.Range(1, 9999)
    15. Dim except = AlleNummern.Except(numberList)
    16. For Each Zahl In except
    17. ListBox1.Items.Add(Zahl)
    18. Next
    19. Dim selectedItem21 As Object
    20. selectedItem21 = ComboBox1.SelectedItem
    21. If selectedItem21.ToString() = "Roboter 2.1" Then
    22. lblRoboter.Text = "Roboter: 2.1"
    23. End If
    24. End Sub


    Dies ist der fertig überarbeitete Code. Wenn ihr noch anmerkungen habt immer her damit. sonst schließe ich das Tehma.

    Vielen Dank. Ich mag dieses Forum echt sehr.

    Gottric schrieb:

    VB.NET-Quellcode

    1. Dim selectedItem21 As Object
    2. selectedItem21 = ComboBox1.SelectedItem
    3. If selectedItem21.ToString() = "Roboter 2.1" Then
    4. lblRoboter.Text = "Roboter: 2.1"
    5. End If
    kannst Du kürzen zu

    VB.NET-Quellcode

    1. If ComboBox1.SelectedItem.ToString() = "Roboter 2.1" Then
    2. lblRoboter.Text = "Roboter: 2.1"
    3. End If
    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!
    Ohje... Was bringt es den Fehler anzuzeigen? Nicht abgreifen, sondern behandeln.

    Edit: Der @ErfinderDesRades hat diesem Thema einen ganzen Thread gewidmet.

    Fakt ist: Wenn ein Fehler auftritt, bringt es halt nix diesen weg zu fangen und einfach weiter zu machen. Tritt ein Fehler auf, hat was nicht funktioniert und es fehlen dann Dinge/Daten, was zu Folgefehlern führt. In welchem.Zustand sich dann dein Programm befindet, weiß dann keiner mehr...

    Programmiere lieber so, das keine Fehler auftreten können. Try/Catch ist nur der aller aller aller letzte Notnagel.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

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

    jo - TryCatch ist ein heißes Eisen
    Schon das Parse hatte ich bewusst gewählt, und sehe das TryParse als zweischneidig.
    Ist halt die Frage: Wenn der Input maschinell generiert ist, dann bedeutet das Auftreten einer Unregelmässigkeit immer einen Fehler, dem man je früher desto besser nachgeht.
    Ein fehlertolerantes Tryparse oder gar ein TryCatch birgt die Gefahr, dass falsche Daten verarbeitet werden, und Fehlentwicklungen womöglich über längere Zeiträume unkorrigiert ihr Unwesen treiben können.

    Bisserl anders ists, wenn Menschen die Datenbasis editieren: Da muss man allerdings damit rechnen, und evtl. auch damit umgehen, dass da beliebiger Daten-Schrott angeliefert werden kann - Da ists dann eine Frage der Strategie, und eine Entscheidung, wieviel Datenmüll man sich bieten lassen will, und auszubügeln man imstande ist.
    Ein fehlertolerantes TryParse ist es erst, wenn man den Fehler zulässt. Man kann damit auch einen maschinellen Inputfehler melden und den auch reparieren und dann weitermachen...
    Was halt dann gefordert ist.

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

    Ich verstehe nicht ganz wie sich da ein Fehler einschleusen sollte in die Datei?
    Es steht immer eine Zahl am Anfang und danach ein Text. IMMER!
    Es können mal unterschiedlich gesetzt Leerzeichen nach der Zahl kommen, aber selbst das greife ich ja ab mit

    VB.NET-Quellcode

    1. Dim sNummer = line.Split({" "c}, StringSplitOptions.RemoveEmptyEntries)(0)

    Oder etwas nicht?
    sont kann da nichts passieren, zu 100 %
    Davon abgesehen schreibe ich ja nicht, ich lese ja nur die Datei aus. Von daher kann ich da nichts fehlerhafts reinschreiben.
    Aber ich lass mich gerne etwas besseren belehren.

    Gottric schrieb:

    Ich verstehe nicht ganz wie sich da ein Fehler einschleusen sollte in die Datei?
    Es steht immer eine Zahl am Anfang und danach ein Text. IMMER!
    Wie gesagt: Dann verwende nix mit Try, sondern Parse (ohne Try), und setze somit deine Vorraussetzung auch in Code um.
    Fang nicht an, Fehler zu behandeln, die überhaupt nicht auftreten können - damit wirste nämlich nie fertig.
    Und solchen Code wird man am Ende auch nicht mehr verstehen können (wie denn auch - ist ja alles blanker Unsinn!).

    Wie gesagt: Wenn nu aus ieinem Grund - den du dir offsichtlich nicht ausmalen kannst - doch ein Fehler auftritt - so musses halt crashen, und zwar möglichst früh, damit du dem Fehler nachgehen kannst.
    Im Voraus darauf vorbereitet sein kannst du ja garnet, also versuch es auch nicht.
    Auch um eine Meldung musste dich nicht bemühen - die Meldungen beim Crash sind inhaltlich sogar ganz vorzüglich, das kannste mit selbstgebastelten Meldungen nur schlimmer machen.

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