Textdatei zufällig auslesen

  • Hallo,

    ich bin neu und beschäftige mich erst seit kurzer Zeit mit AutoIt und bin total begeistert davon. Bisher hat mir ein Bekannter kräftig geholfen, aber hier kommt auch er nicht weiter.
    Ich möchte mit AutoIt eine Textdatei zufällig in einen Array auslesen und danach Zeile für Zeile in ein Eingabefeld eingeben lassen.

    Ich habe also z.B. eine Textdatei mit dem Inhalt:

    Code
    erste Zeile
    zweite Zeile
    dritte Zeile
    vierte Zeile
    fünfte Zeile

    Das zufällige Auslesen habe ich hierdurch teilweise gelöst:

    [autoit]

    Global $text
    _FileReadToArray(@ScriptDir & "\test.txt", $text)
    $random = Random(1,$text[0],1)

    [/autoit]

    Teilweise, weil die Zeilen nicht nach und nach zufällig eingegeben werden, sondern endlos zufällig.
    Ich hoffe ich habe mich so einigermaßen verständlich ausgedrückt :)


    Sollte das nicht möglich sein, hatte mein Bekannter als Alternative die Idee (die eigentlich sogar besser ist), die Zeilen einfach zufällig vertauschen zu lassen und dann in eine neue Textdatei abzuspeichern. Das klappt auch fast mit diesem Code:

    [autoit]

    #include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $text

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _FileReadToArray(@ScriptDir & "\test.txt", $text)

    [/autoit][autoit][/autoit][autoit]

    Global $text2[100]

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $text[0]
    $random = Random(1, $text[0], 1)

    [/autoit][autoit][/autoit][autoit]

    $a=0

    For $j=1 To $i+1
    If $text[$random] = $text2[$j] Then
    $a=$a+1
    Else
    ;$i = $i - 1
    EndIf

    Next

    If $a=0 Then
    $text2[$i] = $text[$random]
    Else
    $i = $i - 1
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Next

    [/autoit][autoit][/autoit][autoit]

    _FileWriteFromArray(@ScriptDir & "\neu.txt", $text2, 1)

    [/autoit]

    Das Problem besteht darin, dass die Anzahl der Zeilen festgelegt werden muss und mindestens eine leere Zeile hinzugefügt wird. Kann man das auch dynamisch lösen, so dass man nicht jedesmal die Zeilenanzahl fest bestimt ODER kann man einfach die leere Zeile löschen lassen bevor das Array in neu.txt gespeichert wird?


    Wenn ihr mir da irgendwie helfen könntet, wäre ich euch wirklich sehr dankbar :)


    Liebe Grüße

    • Offizieller Beitrag

    Getestet. läuft.
    Die Randomzahlen werden in eigenes Array geschrieben. Es wird verglichen ob Randomzahl schon mal gewählt wurde, wenn nicht wird sie im Array erfaßt und die Textzeile mit dieser Zufallsnummer in die Ausgabedatei geschrieben. Fortlaufend bis alle Textzeilen per Random ermittelt wurden.

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    Global $arFile, $arCount[1]
    Dim $filePath = @ScriptDir & "\blabla.txt"
    Dim $outFile = "blabla_out.txt"
    Dim $fh, $random, $match

    [/autoit] [autoit][/autoit] [autoit]

    If Not _FileReadToArray($filePath, $arFile) Then
    MsgBox(0, '', @error)
    Exit
    EndIf
    ReDim $arCount[UBound($arFile)]
    $arCount[0] = 0
    $fh = FileOpen($outFile, 1)
    Do
    $random = Random(1, UBound($arFile)-1, 1)
    $match = 0
    For $i = 1 To UBound($arCount)-1
    If $arCount[$i] = $random Then ; prüft ob Random-Zahl schon verwendet wurde
    $match = 1
    ExitLoop
    EndIf
    Next
    If $match = 0 Then
    $arCount[$random] = $random
    $arCount[0] += 1
    FileWriteLine($fh, $arFile[$random])
    EndIf
    Until $arCount[0] = $arFile[0]
    FileClose($fh)

    [/autoit]
  • @th.meger: Jop, richtig :) Eigentlich müsste die Auswahl nicht in eine neue Datei geschrieben weden, sondern es würde reichen wenn ich diese Liste einfach abarbeiten könnte. Allerdings gefällt mir die Lösung so mit der zweiten Datei mittlerweile besser, dann habe ich etwas mehr Überblick!

    BugFix : Super, vielen Dank! Läuft perfekt, macht ganz genau das was ich wollte :tassen:


    Vielen Dank für eure schnelle Hilfe :)


    Liebe Grüße