_FilerReadToArray und eine Menge komischer Variablen :)

  • Guten Tag/Abend

    Also:
    Ich hab mich wiedermal an einer neuen Variablenskripterei versucht...
    Leider ist es auch beim Versuch geblieben.

    Ich vermute das Problem ist, dass ich einfach den Überblick verloren habe.

    Das Skript verfügt zwar über eine Legende, trotzdem möchte ich hier nocheinmal die Funktion des Skriptes erläutern.
    Eigentlich ist es ja nicht nur ein Skript, das eine Rolle spielt.
    Es sind eher zwei.


    Das erste ist ein Tool mit welchem Fragen und Antworten für eine Art "Quiz" manuell eingetragen werden können. Warum? Damit jeder der mit dem "Quiz" lernen möchte auch seine eigenen Fragen und Antworten zum Standardcontent dazufügen können.

    Skript Nummer 1:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <WindowsConstants.au3>
    $hGui = GUICreate("Includer", 490, 114, 192, 124)
    $Frage = GUICtrlCreateInput("Frage", 8, 16, 473, 21)
    $Antwort = GUICtrlCreateInput("Antwort", 8, 48, 225, 21)
    $bInclude = GUICtrlCreateButton("Include", 240, 48, 89, 25)
    ;~ DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0) ;To set the ProgressBar to WindowsKlassikStile
    $pB = GUICtrlCreateProgress(8, 80, 321, 25)
    $rV = GUICtrlCreateRadio("Violine", 344, 56, 57, 17)
    $rkB = GUICtrlCreateRadio("kl. Bratsche", 400, 56, 81, 17)
    $rgB = GUICtrlCreateRadio("gr. Bratsche", 400, 80, 81, 17)
    $rC = GUICtrlCreateRadio("Cello", 344, 80, 49, 17)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $bInclude
    Global $r1Read = GUICtrlRead($rV), $r2Read = GUICtrlRead($rkB), $r3Read = GUICtrlRead($rgB), $r4Read = GUICtrlRead($rC)
    For $i = 0 To $r4Read -1
    $r1Read = GUICtrlRead($rV)

    Next
    Select
    Case $r1Read = 1
    $fRead = GUICtrlRead($Frage)
    $aRead = GUICtrlRead($Antwort)
    DirCreate(".\Violine")
    FileWriteLine(".\Violine\aVioline.txt",$aRead)
    FileWriteLine(".\Violine\fVioline.txt",$fRead)
    Case $r2Read = 1
    $fRead = GUICtrlRead($Frage)
    $aRead = GUICtrlRead($Antwort)
    DirCreate(".\kl. Bratsche")
    FileWriteLine(".\kl. Bratsche\akl. Bratsche.txt",$aRead)
    FileWriteLine(".\kl. Bratsche\fkl. Bratsche.txt",$fRead)
    Case $r3Read = 1
    $fRead = GUICtrlRead($Frage)
    $aRead = GUICtrlRead($Antwort)
    DirCreate(".\gr. Bratsche")
    FileWriteLine(".\gr. Bratsche\agr. Bratsche.txt",$aRead)
    FileWriteLine(".\gr. Bratsche\fgr. Bratsche.txt",$fRead)
    Case $r4Read = 1
    $fRead = GUICtrlRead($Frage)
    $aRead = GUICtrlRead($Antwort)
    DirCreate(".\Cello")
    FileWriteLine(".\Cello\aCello.txt",$aRead)
    FileWriteLine(".\Cello\fCello.txt",$fRead)
    EndSelect
    Do
    $pRead = GUICtrlRead($pB)
    GUICtrlSetData($pB, $pRead + 25)
    Tooltip("Loading")
    Sleep(60)
    Tooltip("Loading.")
    Sleep(60)
    Tooltip("Loading..")
    Sleep(60)
    Tooltip("Loading...")
    Sleep(60)
    Tooltip("Loading..")
    Sleep(60)
    Tooltip("Loading.")
    Sleep(60)
    Until $pRead = 100
    ToolTip("Ready")
    Sleep(100)
    ToolTip("")
    EndSwitch
    WEnd

    [/autoit]

    Wie sicher einige sofort erkennen, ist der Ladebalken reine Zirde.... :P

    Was macht das Skript:

    Es schreibt die in die Inputboxen eingegeben Daten mittels FileWriteLine in den jeweiligen Ordner des Instruments und sortiert nach Fragen und Antworten.


    Dann sind wir auch schon bei Skript Nummer 2:

    Spoiler anzeigen
    [autoit]

    #Region=========================== Legende ======================================
    ;Der Buchstabe "a" am Anfang einer Variable steht immer für "Antwort"
    ;Bei den Bratschenvariablen steht immer ein "kl" oder "gr" am Anfang. Das steht für "kleine Bratsche" oder "große Bratsche". Nötig, da es von Bratschen zwei verschiedene "Standardgrößen" gibt.
    ;aklBratsche bedeutet also: Antworten für kleine Bratschen
    ;agrBratsche (siehe -1)
    ;aViolin = Eine Liste aller Antworten welche im Ordner ".\Violin" in der "aVioline.txt" - Datei gespeichert sind.

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

    ;Das selbe gibt es nun natürlich auch mit den "Fragen". Der Ablauf ist der gleiche.

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

    ;i am Anfang einer Variable steht bei mir für Index. Hier habe ich versucht, die Anzahl der Fragen und Antworten auszulesen. Dies wir für das erstellen des letzten Arrays(Zweidimensional) benötigt.

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

    ;af steht für "Antwort und Frage". Das ist die Variable für das letzte Array.

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

    ;Die Daten für das Array werden wie schon gesagt aus Textdateien ausgelesn. Diese werden mittels einem externen Programmes geschrieben. Dieses funktioniert mit zwei Inputboxen und speichert die Antworten und Fragen auch gleich in die entsprechenden Ordner.
    #EndRegion======================== Legende ======================================

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

    ;===========================Include==============================
    #include <array.au3>
    #include <file.au3>
    ;===========================Antworten=============================

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

    Global $aViolin, $aklBratsche, $agrBratsche, $aCello
    If Not _FileReadToArray(".\Violine\aVioline.txt",$aViolin) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\Violine\aVioline.txt")
    Exit
    EndIf
    For $x = 1 to $aViolin[0]
    ConsoleWrite($aViolin[$x]&@Crlf)
    Next

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

    If Not _FileReadToArray(".\kl. Bratsche\akl. Bratsche.txt",$aklBratsche) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\kl. Bratsche\akl. Bratsche.txt")
    Exit
    EndIf
    For $x = 1 to $aklBratsche[0]
    ConsoleWrite($aklBratsche[$x]&@Crlf)
    Next

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

    If Not _FileReadToArray(".\gr. Bratsche\agr. Bratsche.txt",$agrBratsche) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\gr. Bratsche\agr. Bratsche.txt")
    Exit
    EndIf
    For $x = 1 to $agrBratsche[0]
    ConsoleWrite($agrBratsche[$x]&@Crlf)
    Next

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

    If Not _FileReadToArray(".\Cello\aCello.txt",$aCello) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\Cello\aCello.txt")
    Exit
    EndIf
    For $x = 1 to $aCello[0]
    ConsoleWrite($aCello[$x]&@Crlf)
    Next
    ;===========================Fragen=============================
    Global $fViolin, $fklBratsche, $fgrBratsche, $fCello
    If Not _FileReadToArray(".\Violine\fVioline.txt",$fViolin) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\Violine\fVioline.txt")
    Exit
    EndIf
    For $x = 1 to $fViolin[0]
    ConsoleWrite($fViolin[$x]&@Crlf)
    Next

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

    If Not _FileReadToArray(".\kl. Bratsche\fkl. Bratsche.txt",$fklBratsche) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\kl. Bratsche\fkl. Bratsche.txt")
    Exit
    EndIf
    For $x = 1 to $fklBratsche[0]
    ConsoleWrite($fklBratsche[$x]&@Crlf)
    Next

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

    If Not _FileReadToArray(".\gr. Bratsche\fgr. Bratsche.txt",$fgrBratsche) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\gr. Bratsche\fgr. Bratsche.txt")
    Exit
    EndIf
    For $x = 1 to $fgrBratsche[0]
    ConsoleWrite($fgrBratsche[$x]&@Crlf)
    Next

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

    If Not _FileReadToArray(".\Cello\fCello.txt",$fCello) Then
    MsgBox(4096,"Error", " Error: " & @error&@CRLF&".\Cello\fCello.txt")
    Exit
    EndIf
    ;==================Index der einzelnen .txt Dateien auslesen==================================
    For $x = 1 to $fCello[0]
    ConsoleWrite($fCello[$x]&@Crlf)
    Next
    For $iViolin = 0 To UBound($fViolin) -1
    ConsoleWrite($iViolin&@Crlf)
    Next
    For $iklBratsche = 0 To UBound($fklBratsche) -1
    ConsoleWrite($iklBratsche&@Crlf)
    Next
    For $igrBratsche = 0 To UBound($fgrBratsche) -1
    ConsoleWrite($igrBratsche&@Crlf)
    Next
    For $iCello = 0 To UBound($fCello) -1
    ConsoleWrite($iCello&@Crlf)
    Next
    ;========================In ein zweidimensionales Array eintragen============================
    Global $afViolin [$iViolin][2]
    $afViolin[$iViolin][1] = $fViolin
    $afViolin[$iViolin][2] = $aViolin

    Global $afklBratsche [$iklBratsche][2]
    $afklBratsche[$iklBratsche][1] = $fklBratsche
    $afklBratsche[$iklBratsche][2] = $aklBratsche

    Global $afgrBratsche [$igrBratsche][2]
    $afgrBratsche[$igrBratsche][1] = $fgrBratsche
    $afgrBratsche[$igrBratsche][2] = $agrBratsche

    Global $afCello [$iCello][2]
    $afCello[$iCello][1] = $fCello
    $afCello[$iCello][2] = $aCello

    [/autoit]


    Was macht das Skript:

    Es liest die Daten aus den .txt-Dateien aus und schreibt diese in ein eindimensionales Array. Jeweils eines für Antworten und Fragen.
    Im nächsten Schritt werden die Beiden Arrays (a und f) in einem Array zusammengeführt. Dabei sollten die Fragen in Spalte 1 und die Antworten in Spalte 2 eingeordnet werden.

    Genau hier liegt der Haken...


    Mit freundlichen Grüße
    Stoani

    mfg, Stoani

    Einmal editiert, zuletzt von Stoani (17. November 2011 um 21:27) aus folgendem Grund: SUPER BEANTWORTET VON MISTERSPEED! DANKE

  • Hab zwar keine Zeit mir deine beiden Scripte anzusehen und nachzusehn was nicht funktioniert, aber beim Überfliegen und deiner Erläuterung würde ich dir vorschlagen deine komplizierte Struktur zu vereinfachen.
    Schreib alle Fragen und Antworten für alle Kategorien in eine einzige Datei und lies diese auch nur einmalig in ein 2d Array ein. Das macht es übersichtlicher und du musst nicht mit zig Arrays rummachen.

    Beispiel Datei:

    Code
    Fragenkategorie,Frage,Antwort
    Violine,bla,blaAntwort
    Violine,bla,blaAntwort
    Bratsche,bla,blaAntwort
    Chello,bla,blaAntwort
    Bratsche,bla,blaAntwort

    Datei einlesen:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <file.au3>

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

    Global $DataFile=@ScriptDir & "\data.csv"

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

    $aData=readCSV($DataFile)
    _ArrayDisplay($aData)

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

    Func readCSV($file)
    Local $aTemp
    _FileReadToArray($file,$aTemp)
    Local $aReturn[$atemp[0]][3]

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

    for $i=1 to $aTemp[0]
    $aSplit=StringSplit($atemp[$i],",",2)
    for $j=0 to UBound($aSplit)-1
    $aReturn[$i-1][$j]=$aSplit[$j]
    Next
    Next

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

    Return $aReturn
    EndFunc

    [/autoit]

    Beispielausgabe:

    Spoiler anzeigen
    [autoit]


    $trefferindex=_arraysearch($aData,"Bratsche",1,0,0,0,1,0)
    $frage=$aData[$trefferindex][1]
    $userantwort=inputbox("Frage 1",$frage)
    if $userantwort = $aData[$trefferindex][2] then
    msgbox(0,"Richtig","Glückwunsch deine Antwort war richtig")
    else
    msgbox(0,"Falsch","Die richtige Antwort wäre gewesen: " & @crlf & $aData[$trefferindex][2])
    endif

    [/autoit]

    Alternativ zu Arraysearch kannst du auch anders vorgehen, zum Beispiel die Kategorie vorgeben lassen und dann das 2d Array durchlaufen und nur die Fragen stellen die zur gewählten Kategorie gehören:


    Spoiler anzeigen
    [autoit]


    $kategorie = "Violine"

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

    $nummer=1
    for $i=0 to ubound($aData)-1
    if stringinstr($aData[$i][0],$kategorie) then
    $userantwort=inputbox("Frage " & $nummer,$aData[$i][1])
    if $userantwort = $aData[$i][2] then
    msgbox(0,"Richtig","Glückwunsch deine Antwort war richtig")
    else
    msgbox(0,"Falsch","Die richtige Antwort wäre gewesen: " & @crlf & $aData[$i][2])
    endif
    $nummer+=1
    endif
    next

    [/autoit]
  • Hallo misterspeed,

    erstmal Danke für deine Antwort! :thumbup:


    Die Idee mit dem Auslesen einer einzigen Datei ist zwar gut, allerdings möchte ich das Programm so gestalten, dass der Benutzer (Klassenkollegen,etc) die Fragen selber Ergänzen kann. Deshalb auch das externe "Inputskript".
    Was mir bei der Idee unklar ist, ist die Vorgehensweise nachdem die Frage bzw. Antwort ausgelesen wurden. Denn:
    Wenn ich das ganze in einer Textdatei speichere, wie kann ich sicherstellen das der Output in die richtige "Sektion" geschrieben wurde?
    Vielleicht ist es ja eh lösbar, doch mir ist der Befehl dazu glaub ich nicht bekannt. Oder ich hab deinen Vorschlag zum Auslesen noch nicht ganz verstanden :S

    Leichter wäre es, wenn ich das Ganze aus einer .ini-Datei auslese, da ich dort sowieso alles in Sektionen einteilen kann.

    Auf jedenfall sind deine Beispielskripte extrem hilfreich für mich. Danke.


    Es gibt doch nix schöneres wie ein Problem beim Skripten :D Ist irgendwie fast eine Art von Sudoku... xD

    Mit freundlichen Grüßen
    Stoani


    ___________________________________ Edit ___________________________________

    Sorry. Ich hätte das nicht schreiben sollen, bevor ich es nicht richtig versucht habe. Läuft SUPER!


    -> :thumbup:


    Mit freundlichen Grüßen
    Stoani

    mfg, Stoani

    2 Mal editiert, zuletzt von Stoani (17. November 2011 um 21:26)