VB Zufällige Zeilen aus textdatei in Textbox wieder geben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Testopmeas2.

    VB Zufällige Zeilen aus textdatei in Textbox wieder geben

    Hallo ihr :D

    Ich habe eine Idee von einem Programm das Zufällige Zeilen(Anzahl der Zeilen soll angebar sein) aus einer Textdatei in eine TextBox packt.
    So soll es funktionieren:

    1.Ich wähle eine .txt aus mit z.B 7.000 Zeilen es sind alle Namen oder Nummern
    2.Ich gebe in einer anderen TextBox eine Anzahl an, wie viele Zeilen aus der Textdatei ausgewählt werden z.B 400 Namen
    3.Dann drücke ich auf dem Button und es werden 400 Zufällige Namen aus der .txt in die TextBox gepackt, die ich auch abspeichern kann

    Hier ein kleiner Code denn ich geschafft habe aber nur mit 1ner Zeile aus der .txt
    Ich weiß nicht wie ich das machen soll, das ich die Anzahl der Zufälligen Zahlen angeben kann und am beste keine Duplicationen... :(

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Linq
    2. Public Class Form1
    3. Private ofd As Object
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim names As System.Collections.Generic.List(Of String) _
    6. = System.Text.RegularExpressions.Regex.Split _
    7. (My.Computer.FileSystem.ReadAllText(TextBox2.Text), vbCrLf).ToList
    8. Dim rnd As New Random
    9. TextBox1.Text = names.Item(rnd.Next(names.Count))
    10. End Sub
    11. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    12. Dim ofd As New OpenFileDialog
    13. ofd.Filter = "All files (*.*)|*.*"
    14. ofd.ShowDialog()
    15. TextBox2.Text = ofd.FileName
    16. End Sub
    17. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    18. My.Computer.Clipboard.SetText("" & TextBox1.Text)
    19. End Sub
    20. End Class

    Dieses Dingens ist geeignet, eine List(Of String) durcheinanderzuwürfeln:

    VB.NET-Quellcode

    1. Private _Rnd As New Random
    2. ''' <summary> Fisher-Yates-Mixing up the itms. On seed&lt;0 the random seed is used </summary>
    3. Public Sub Shuffle(itms As IList, Optional seed As Integer = -1)
    4. If seed >= 0 Then _Rnd = New Random(seed)
    5. For i = itms.Count - 1 To 1 Step -1
    6. itms.Swap(i, _Rnd.Next(i + 1))
    7. Next
    8. End Sub

    @Testopmeas2 Willkommen im Forum. :thumbup:
    So was:

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. Dim lines As List(Of String) = IO.File.ReadAllLines("c:\Temp\test.txt").ToList() ' die Datei in eine List(Of String) einlesen
    3. If lines.Count < 400 Then ' Test auf korrekte Anzahl
    4. MessageBox.Show("zu wenig Zeilen")
    5. Return
    6. End If
    7. Dim rnd = New Random ' Zufallsgenerator starten
    8. For i = 400 To 1 Step -1 ' Anzahl der Zeilen, rückwärts, falls nicht mehr genug Zeilen da sind
    9. Dim nummer = rnd.Next(i) ' Zeilennummer generieren
    10. RichTextBox1.AppendText(lines(nummer) & Environment.NewLine) ' Zeile an die TextBox hängen
    11. lines.RemoveAt(nummer) ' übertragene Zeile aus der Source löschen
    12. Next
    13. 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!
    Erstmal Danke euch beiden für die Schnelle Antwort :D

    @RodFromGermany Danke erstmal das du mich Willkommen heißt ^^
    Und genau die Funktion die du gemacht hast meine ich :)
    Bin leider noch ziemlich neu, deswegen frage ich wäre das möglich

    VB.NET-Quellcode

    1. For i = 400 To 1 Step -1


    Könnte man die 400 die reingepackt werden sogesehen in "TextBox.Text" ändern? :/
    Sogesehen das man die Anzahl die man aus der .txt haben möchte "Selberreinschreiben" kann
    @Testopmeas2 Kein Problem. Nimm lieber ein NumericUpDown-Control, in einer TextBox könnte "Roulade mit Klößen" stehen, das lässt sich schlecht zu einem Integer konvertieren.

    VB.NET-Quellcode

    1. For i = NumericUpDown.Value To 1 Step -1
    2. ' ...
    3. Next

    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!
    @Testopmeas2 Sorry, kleiner Fehler.
    Du willst ja alle vorhandenen Zeilen der Datei verwenden, um daraus Deine z.B. 400 Zeilen rauszuholen.
    Da müsen wir den Zufallsgenerator natürlich mit der aktuellen Zeilenzahl auslesen: Dim nummer = rnd.Next(lines.Count)
    Und nun können wir die Schleife auch einfach vorwärts laufen lassen:

    VB.NET-Quellcode

    1. Dim rnd = New Random ' Zufallsgenerator starten
    2. For i = 1 To 400 ' Anzahl der Zeilen, rückwärts, falls nicht mehr genug Zeilen da sind
    3. Dim nummer = rnd.Next(lines.Count) ' Zeilennummer über die restlichen Zeilen der Datei generieren
    4. RichTextBox1.AppendText(lines(nummer) & Environment.NewLine) ' Zeile an die TextBox hängen
    5. lines.RemoveAt(nummer) ' übertragene Zeile aus der Source löschen
    6. Next

    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!
    Jo - so ists schon fast ein Fisher-Yates - nur der richtige ist bisserl performanter, da er statt "teurer" Löschungen nur Elemente umtauscht. Aber ich hab auch was vergessen - die .Swap - Extension.

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. Dim lines = IO.File.ReadAllLines("c:\Temp\test.txt")
    3. lines.Shuffle()
    4. RichTextBox1.Lines = lines.Take(400).ToArray
    5. End Sub
    6. End Class
    7. Public Module CollectionExtensions
    8. Private _Rnd As New Random
    9. ''' <summary> Fisher-Yates-Mixing up the itms. On seed&lt;0 the random seed is used </summary>
    10. <Extension(), DebuggerStepThrough()> _
    11. Public Sub Shuffle(itms As IList, Optional seed As Integer = -1)
    12. If seed >= 0 Then _Rnd = New Random(seed)
    13. For i = itms.Count - 1 To 1 Step -1
    14. itms.Swap(i, _Rnd.Next(i + 1))
    15. Next
    16. End Sub
    17. <Extension(), DebuggerStepThrough()> _
    18. Public Sub Swap(items As IList, I1 As Integer, I2 As Integer)
    19. Dim Tmp = items(I1)
    20. items(I1) = items(I2)
    21. items(I2) = Tmp
    22. End Sub
    23. End Module
    Hmm - Eigenbeteiligung des TE: 0.