frei Zahlen in Textdatei finden

  • VB.NET

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

    frei Zahlen in Textdatei finden

    Hallo zusammen,

    ich würde gerne eine Datei nach freien Zahlen durchsuchen die am Zeilenanfang stehen. Es sind maximal Zahlen von 1-9999.
    Ich hätte gerne dass mir in deiner Listbox oder Textbox die Zahlen dann ausgegeben werden die nicht in der Datei stehen die durchsucht wwerden soll.
    Momentan überprüfe ich die Datei nach einer bestimmten Zahl, funktioniert auch super, wäre aber sinnvoller bzw. einfacher wenn ich angezeigt bekommen würde welche Zahlen nicht verwendet werden.

    Beispiel:
    1 grün
    2 gelb
    3 rot
    5 lila
    6 blau
    9 schwarz

    wäre schön wenn er mir dann 4, 7, 8 etc. ausgeben würde.


    Code den ich momentan verwende:

    VB.NET-Quellcode

    1. dir21prg = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    2. dir21dbk = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    3. If dir21prg.Contains(txtPrgNr.Text) Or dir21dbk.Contains(txtPrgNr.Text) Then
    4. MsgBox("Nummer ist schon vergeben an Roboter 2.1!", MsgBoxStyle.Information, "Info")


    vielleicht habt ihr ja ne idee, danke.
    Es gibt dazu 3 Klassen, die dir helfen, dein Problem zu lösen:
    Wie man am Anfang eines Strings eine Zahl extrahiert (String-Klasse)
    Wie man die extrahierte Zahl in eine Liste aufnimmt (List(T)-Klasse)
    Wie man eine Differenzmenge von zwei Listen macht (Enumerable.Except)
    Hmm, das übersteigt mein Wissen dann doch sehr. Schade.
    Da feht mir viel zu viel Hintergundinfo um das alles zu verstehen. Hab auf einen Beispielcode gehofft auf den ich dann aufbauen kann.
    Ich lese es mir mal gründlich durch, vielleicht kommt ja der Aha-Effekt.
    trotzdem danke

    Edit:
    Ich habe es jetzt soweit dass er mir 2 Zahlen reihen miteinander vergleicht und die in die Listbox schreibt die nich darin vorkommen. Top :)

    VB.NET-Quellcode

    1. Dim AlleNummern() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    2. Dim dirDatei() As Integer = {9, 10}
    3. Dim except = AlleNummern.Except(dirDatei)
    4. For Each Zahl In except
    5. ListBox1.Items.Add(Zahl)
    6. 'MsgBox(Zahl)
    7. Next


    Jetzt muss ich nur noch bewerkstelligen dass er mir als AlleNummern alle Zahlen von 1-9999 schreibt, geht bestimmt. Muss ja da keine 10000 Zahlen reinschreiben.
    und als dirDatei soll er mir dann bitte eine Datei einlesen und alle Anfangszahlen von jeder Zeile dieser Datei so abgleichen.

    Schlagworte sind Starswith, für den Anfang der Datei zu lesen und dass die dirDatei dann nicht als Interger funktioniert ist mir auch soweit klar. aber weiter bin ich bis jetzt nicht gekommen, hoffe es kann mir jemand noch helfen.


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

    Hallo @VB1963,
    habe deinen Tip umgesetzt und funktioniert. Danke

    hier der Code:

    VB.NET-Quellcode

    1. Dim AlleNummern As IEnumerable(Of Integer) = Enumerable.Range(1, 20)
    2. 'Dim Vergleich() As Integer = {(AlleNummern)}
    3. Dim dirDatei() As Integer = {9, 10, 15}
    4. Dim except = AlleNummern.Except(dirDatei)
    5. For Each Zahl In except
    6. ListBox1.Items.Add(Zahl)
    7. 'MsgBox(Zahl)
    8. Next


    Jetzt bin ich dran in der Textdatei die Zahlen am Anfang der Zeile von dem Dahinterstehenden Text zu trennen.
    Ich versuche es mit Line.Substring() aber irgendwie klappt das nicht so.

    VB.NET-Quellcode

    1. For Each Line As String In IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat", System.Text.Encoding.Default)
    2. Line = Line.TrimStart.Substring(2)
    3. MsgBox(Line)
    4. Next


    Er macht es genau falschrum, ich will nicht den Text angezeigt bekommen hinter der Zahl sondern ja die Zahlen dass ich sie mit dem Spektrum von -AlleNummern- vergleichen kann und er mir dann ausgibt welche nicht in der Textdatei stehen. Muss es ja voneinander trennen um nur Zhalen zu bekommen da die Vergleichsoperation nur mit interger arbeitet. sowie ich das verstanden habe. bin ich auf dem richtigen weg? jemand ne Idee wie ich das anstelle?

    Edit:
    jetzt ist mir gerade aufgefallen dass ich mit Substring(2) ja nur die ersten 2 Positionen aus dem String entferne. verdammt:-)
    zunächstmal: Mach dich mit dem VisualStudio vertraut, insbesondere mit dem ObjectBrowser.
    Dann kannst du dort auch die Dokumentation der String.SubString() - Methode nachlesen, und wirst die Überladung finden, die es "richtigrum" machen kann.
    VisualStudio richtig nutzen

    Eventuell fehlen dir auch Grundlagen - etwa: was ist eine Überladung überhaupt? - und solche Sachen. Da habich hier mal eine Überfliegung zusammengestellt:
    Grundlagen: Fachbegriffe

    Allerdings glaube ich garnet, dass Substring wirklich geeignet ist, weil das kann dir nur einen Teilstring fester Länge liefern - wird bei mehr oder weniger Ziffern also falsche Werte liefern, und bei einer Leerzeile wirds ausserdem crashen.
    Falls ich damit recht habe, könntest du dich der String.Split() - Methode zuwenden, und einfach immer den ersten Splitter der Zeile nehmen.

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

    Das mit dem Split ist sicher die bessere Methode.
    ich habe es mir mal angesehen aber so wirklich will es nicht klappen.

    VB.NET-Quellcode



    Ist es überhaupt möglich die Datei so einzulesen wie ich sie brauche?

    Sie sieht wie folg aus:
    1 grün
    2 gelb
    3 rot
    5 lila
    6 blau
    9 schwarz
    715 organe
    etc.

    ich will den Text hinter den Zahlen abschneiden und nur die Zahlen dann als Integer in meine Code einpflegen. Dann funktioniert das denke ich.
    Dann verlgeiche ich ja alle Zhalen am Anfang der Textdatei mit den Zahlen die ich genneriere von 1-9999.

    VB.NET-Quellcode

    1. Dim AlleNummern As IEnumerable(Of Integer) = Enumerable.Range(1, 20)
    2. 'Dim Vergleich() As Integer = {(AlleNummern)}
    3. Dim dirDatei() As Integer = {9, 10, 15}
    4. Dim except = AlleNummern.Except(dirDatei)
    5. For Each Zahl In except
    6. ListBox1.Items.Add(Zahl)
    7. 'MsgBox(Zahl)
    8. Next


    Wäre toll wenn mir jemand mal ein Beispiel zeigen könnte.

    Danke.
    Da fehlt der Quellcode im Code-Tag?

    Gottric schrieb:

    Muss es ja voneinander trennen um nur Zhalen zu bekommen da die Vergleichsoperation nur mit interger arbeitet.
    Versuche das einmal so:

    VB.NET-Quellcode

    1. Dim zahl As String = String.Join("", deineLine.TakeWhile(Function(n) "0123456789".Contains(n)))
    Hier wird dir die Zahl als String ausgegeben, die musst du noch zu Integer konvertieren - aber schaue dir die Beschreibungen der einzelnen Methoden einmal genau bei MSDN an, was sie da alles machen...

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

    Du musst doch nur String.Split(" ") machen und dann den ersten Wert im Array in ein Integer konvertieren.
    "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
    @mrMo, wie stell ich das denn an? Ich denke an meinen ganzen postes die ich hier schon gemacht habe erkennt man dass ich mich bemühe und nicht alles vorgekaut haben will, ganz im gegensatz zu andern leuten hier im Forum.
    aber irgendwie steh ich auf dem schlauch. hab ja schon alles. nur das mit dem split funktioniert nicht wie ich das will.

    Gottric schrieb:

    nur das mit dem split funktioniert nicht wie ich das will.

    Es gibt dazu aber mehrere Wege nach Rom (wurden eigentlich schon alle irgendwie gezeigt):

    VB.NET-Quellcode

    1. Dim line As String = " 123?45 Hallo Welt!"
    2. Dim v0 = String.Join("", line.TrimStart.TakeWhile(Function(n) "0123456789".Contains(n)))
    3. Dim v1 = line.Split(" "c)(0)
    4. Dim v2 = line.Substring(0, line.IndexOf(" "c))
    Dazu gibt es sicher noch einige...
    Die Ergebnisse sind alle vom Typ String, den du später irgend einmal auf Integer konvertieren musst.
    Wichtig: teste die obigen Beispiele durch und versuche den Hergang zu verstehen. Nimm dazu am einfachsten F1 zur MSDN-Hilfe...

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

    Ja, ich hab auch alle mal versucht umzusetzen. aber funktioniert nicht.
    dann probier ich mal weiter rum.

    danke euch allen.

    melde mich dann wenn ich es irgendwie hinbekommen habe.

    Edit:

    hab es :)

    VB.NET-Quellcode

    1. Dim Dir21 = File.ReadAllLines(Pfadprg21prg + "prg__dir.dat")
    2. For Each line In Dir21
    3. Dim liste = line.Split(" "c)(1)
    4. ListBox1.Items.Add(liste)
    5. Next


    jetzt setz ich mich dran dies in den Code zum vergleichen einzupflegen. Muss ja dann erst in Integer umgewandelt werden denke ich mal.


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

    Alle Zahlen die in der Datei stehen vor dem String.
    Beisspiel:
    in der Datei steht:
    1 grün
    2 gelb
    3 rot
    5 lila
    6 blau
    9 schwarz

    in meiner Liste steht jetzt:
    1
    2
    3
    5
    6
    9

    jetzt versuch ich den Code so hinzubekommen dass er mir die Liste die ich eben erstellt habe mir der Liste von Zahlen 1-9999 abgleicht und mir in die Listbox schreibt welche nicht dort vorhanden sind, also noch zur Verfügung stehen würden.

    VB.NET-Quellcode

    1. Dim Dir21 = File.ReadAllLines(Pfadprg21prg + "prg__dir.dat")
    2. For Each line In Dir21
    3. Dim liste = line.Split(" "c)(1)
    4. Dim listeZahlen As Integer = CInt(liste)
    5. Dim Result As Integer
    6. Integer.TryParse(CType(listeZahlen, String), Result)
    7. Dim AlleNummern As IEnumerable(Of Integer) = Enumerable.Range(1, 9999)
    8. 'Dim Vergleich() As Integer = {(AlleNummern)}
    9. Dim dirDatei() As Integer = {Result}
    10. Dim except = AlleNummern.Except(dirDatei)
    11. For Each Zahl In except
    12. ListBox1.Items.Add(Zahl)
    13. Next
    14. Next


    aber so wirklich will es noch nicht klappen. Er sagt mir IEnumerable(Of Integer) kann nicht in Intger konvertiert werden.

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

    Hab ich gemacht. Wenn ich es mit

    VB.NET-Quellcode

    1. ListBox1.Items.Add(liste)
    in die Listbox schreibe passt alles, hab ich gegengeprüft in dem ich einfach 3000 Zahlen aus der eigentlichen Datei rausgelöscht habe, diese schreibt er mir dann nicht mehr in die Listbox, also echt nur die die auch in der eingeltichen Datei vorhanden sind.
    Aber, jetzt kommt das große ABER:
    wenn ich die Liste speicher mit

    VB.NET-Quellcode

    1. IO.File.WriteAllText(Pfadprg21prg + "test.txt", liste)
    dann schreibt er 9999 in die erstellte Textbox, das wars.

    Edit:
    in Zeile Nummer 4 versuche ich die Liste in interger umzuwandeln um damit die erstellte liste aus Zeile 7 abgleichen zu können.
    Was hast du gemacht?
    Vergewissere dich, was zu Beginn der Schleife in line steht und was dir in liste ausgegeben wird - es ist sicher kein Ergebnis, dass in Integer konveriert werden kann...
    Und ja - Nomen est Omen ;)

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