Textdateien auslesen bei diesem Script ?

  • Hallo,

    ich sitze nun schon 1 Stunde daran, dass die Textdateien ausgelesen werden sollen. Immer wieder kommen Fehlermeldungen.

    Könntet ihr mir dort bitte helfen?

    Aktuelles Script :

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>

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

    $hGUI = GUICreate("", 620, 657, -1, -1, $WS_POPUP)
    $hEdit = GUICtrlCreateEdit("", 0, 0, 633, 529)
    $hInput = GUICtrlCreateInput("", 0, 560, 513, 21)
    $hBtnSenden = GUICtrlCreateButton("Senden", 528, 560, 75, 25, $WS_GROUP)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    $hBtnBeenden = GUICtrlCreateButton("Beenden", 528, 608, 75, 25, $WS_GROUP)
    $hPic = GUICtrlCreatePic("C:\Users\Dennis\Pictures\Tool Background.jpg", 0, 520, 636, 360, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)

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

    Dim $aFragen[2][4] = [["Guten Tag", "Moin", "Hallo"],["geht", "gehts", "stehts", "alles klar"]]
    Dim $aAntworten[2][4] = [["Guten Tag, mein Name ist White, wie kann ich ihnen helfen?", "Guten Tag."],["Gut und dir?", "Gut soweit. Und ihnen?", "Das geht dich nichts an!"]]

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $hBtnBeenden
    Exit
    Case $hBtnSenden
    $sText = GUICtrlRead($hInput)
    _say($hEdit, $sText, @UserName)
    $iFragenID = _FrageAnalysieren($sText, $aFragen)
    If @error Then
    If @error = 1 Then
    _say($hEdit, "Du musst schon etwas fragen!", "Computer")
    ElseIf @error = 2 Then
    _say($hEdit, "Das weiß ich leider nicht", "Computer")
    EndIf
    Else
    _say($hEdit, _SucheAntwort($iFragenID), "Computer")
    EndIf

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

    EndSwitch
    WEnd

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

    Func _SucheAntwort($iFragenID)

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

    While 1
    $iRnd = Random(0, UBound($aAntworten, 2) - 1, 1)
    If $aAntworten[$iFragenID][$iRnd] <> "" Then ExitLoop
    WEnd

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

    Return $aAntworten[$iFragenID][$iRnd]
    EndFunc

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

    Func _Say($hEdit, $sText, $sPerson)

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

    $hWnd = GUICtrlGetHandle($hEdit)

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

    Local $iLength = _GUICtrlEdit_GetTextLen($hWnd)
    _GUICtrlEdit_SetSel($hWnd, $iLength, $iLength)
    _SendMessage($hWnd, $EM_REPLACESEL, True, $sPerson & ": " & $sText & @CRLF, 0, "wparam", "wstr")
    EndFunc ;==>_Say

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

    Func _FrageAnalysieren($sText, $aFragen)

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

    Local $i, $i1

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

    If $sText <> "" Then
    For $i = 0 To UBound($aFragen) - 1
    For $i1 = 0 To UBound($aFragen, 2) - 1
    If StringInStr($sText, $aFragen[$i][$i1], 2) Then
    Return $i
    EndIf
    Next
    Next
    Else
    Return SetError(1, 0, -1)
    EndIf
    Return SetError(2, 0, -1)
    EndFunc ;==>_FrageAnalysieren

    [/autoit]

    Wie kann ich dort

    [autoit]

    $aFragen = _FileReadTo2dArray("Fragen.txt", "|")
    $aAntworten = _FileReadTo2dArray("Antworten.txt", "|")

    [/autoit]

    reinbauen, sodass er immer bestimmte Wörter erkennt, wie oben bei meinem Script?

  • Hallo White,
    wenn ich das richtig sehe bindest Du die

    [autoit]

    #include <File.au3>

    [/autoit]

    Bibliothek nicht in Dein Script ein. Diese wird aber benötigt, um

    [autoit]

    _FileReadToArray()

    [/autoit]

    ausführen zu können.
    Außerdem fehlt in Zeile 20 eine eckige Klammer, um die Wertzuweisung des Arrays zu beenden.
    Dein eigentliches Problem könntest Du dann mit

    [autoit]

    _ArraySearch()

    [/autoit]

    und

    [autoit]

    StringReplace()

    [/autoit]

    oder vielleicht auch mit

    [autoit]

    StringInStr()

    [/autoit]

    lösen.
    Eventuell könnte Dir

    [autoit]

    StringRegExp()

    [/autoit]

    ebenfalls weiterhelfen.

  • Okay danke werde gleich mal jeden Befehl anschauen und es dann mal versuchen.

    MfG White

  • So ich habe es nun so versucht, wie du es in der Art gesagt hast und so sieht nun mein Ergebniss aus :

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("", 620, 657, 182, 144, $WS_POPUP)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 633, 529)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 0, 560, 513, 21)
    $senden = GUICtrlCreateButton("senden", 528, 560, 75, 25, $WS_GROUP)
    $Beenden = GUICtrlCreateButton("Beenden", 528, 608, 75, 25, $WS_GROUP)
    $Pic1 = GUICtrlCreatePic("Background.jpg", 0, 520, 636, 360, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)

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

    While 1
    Switch (GUIGetMsg( ))
    Case $suchen
    Local $sBuffer
    Dim $Text
    Dim $Fragen
    Dim $Antworten
    _FileReadToArray("Antwort.txt","|", $Fragen)
    _FileReadToArray("Frage.txt", "|", $Antworten)
    $sBuffer = GuiCtrlRead($Input1)
    For $i = 1 To UBound($Zeilen) - 1
    If $Text[$i] = $sBuffer Then
    If (StringRegExp ($sBuffer, $Fragen[$i]) Then
    Local $iRnd = Random(1, 2, 1)
    Switch $iRnd
    GUICtrlSetData($Edit1, $Antworten[$i])
    EndIf
    EndIf
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Wieso kommt dort eine Fehlermeldung? Ich versteh nicht, was daran falsch sein soll..

    Einmal editiert, zuletzt von White (15. Juni 2011 um 21:47)

  • sehe ich das falsch oder hast du in zeile 27 eine ( zuviel ??

    ich denke die sollte weg oder

    [autoit]

    (StringRegExp

    [/autoit]


    außdem alleine wenn du es mal laufen lässt und in deine console siehst dann würden dir die fehler ins auge stechen. sry
    aber iwie schreibt du iwas zusammen in der hoffnung das es schon iwie funzt
    WARNING: $suchen: possibly used before declaration.
    Case $suchen
    z.b. kommt bei mir
    und 6 error(s), 2 warning(s)

    Einmal editiert, zuletzt von Osiris (15. Juni 2011 um 21:29)

  • Also sieht es dann so aus :

    If StringRegExp ($sBuffer, $Fragen[$i]) Then

    Es gibt jedoch immernoch Fehlermeldungen ;(

    Das muss so ja eigtl richtig sein...

  • Alsobin bin selbst Anfäger aber selbst ich sehe dass es sonicht gehen kann.
    du hast 2 buttons die meines erachtens ins nciht führen
    und ne func die nicht deklariert ist $suchen

    p.s wenn ich mich irre dann sry , aber so sehe ich dein script versuch

  • Upps habe ja einen falschen Buttonnamen angegeben und vergessen File.au3 zu includen.

    Gibt trotzdem noch eine Fehlermeldung und ansonsten kann ich dort nichts entdecken ..

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("", 620, 657, 182, 144, $WS_POPUP)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 633, 529)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 0, 560, 513, 21)
    $senden = GUICtrlCreateButton("senden", 528, 560, 75, 25, $WS_GROUP)
    $Beenden = GUICtrlCreateButton("Beenden", 528, 608, 75, 25, $WS_GROUP)
    $Pic1 = GUICtrlCreatePic("Background.jpg", 0, 520, 636, 360, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)

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

    Local $sBuffer
    Dim $Text
    Dim $Fragen
    Dim $Antworten
    _FileReadToArray("Antwort.txt","|", $Fragen)
    _FileReadToArray("Frage.txt", "|", $Antworten)

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

    While (TRUE)
    Switch (GUIGetMsg( ))
    Case $GUI_EVENT_CLOSE
    Exit
    Case $senden
    $sBuffer = GuiCtrlRead($Input1)
    For $i = 1 To UBound($Zeilen) - 1
    If $Fragen[$i] = $sBuffer Then
    If StringRegExp ($sBuffer, $Fragen[$i]) Then
    Local $iRnd = Random(1, 2, 1)
    Switch $iRnd
    GUICtrlSetData($Edit1, $Antworten[$i])
    EndIf
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von White (15. Juni 2011 um 21:46)

  • Welche Console? Ich führe mein Script immer aus und er sagt nur , dass in Zeile 44 ein Fehler ist. Also immer nur 1 Error.

  • Zitat

    C:\Users\i2c\Desktop\DEVELOPE\AutoIt\1.au3(24,56) : ERROR: _FileReadToArray() called with wrong number of args.
    _FileReadToArray("Antwort.txt","|", $Fragen)


    Steht doch alles da. Du hast die Funktion mit zu vielen/zu wenigen Parametern aufgerufen.

    Das Klammerninferno bei While und Switch ist unnötig.

  • Gerade neu versucht, jedoch funktioniert es wieder nicht. Könntet ihr es mal bitte für mich versuchen?

  • Überarbeitet :

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("", 620, 657, 182, 144, $WS_POPUP)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 633, 529)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 0, 560, 513, 21)
    $senden = GUICtrlCreateButton("senden", 528, 560, 75, 25, $WS_GROUP)
    $Beenden = GUICtrlCreateButton("Beenden", 528, 608, 75, 25, $WS_GROUP)
    $Pic1 = GUICtrlCreatePic("Background.jpg", 0, 520, 636, 360, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)

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

    Local $sBuffer
    Dim $Text
    Dim $Fragen
    Dim $Antworten
    _FileReadToArray("Antwort.txt", $Fragen)
    _FileReadToArray("Frage.txt", $Antworten)

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

    While (TRUE)
    Switch (GUIGetMsg( ))
    Case $GUI_EVENT_CLOSE
    Exit
    Case $senden
    $sBuffer = GuiCtrlRead($Input1)
    For $i = 1 To UBound($Fragen) - 1
    If $Fragen[$i] = $sBuffer Then
    If StringRegExp ($sBuffer, $Fragen[$i]) Then
    Local $iRnd = Random(1, 2, 1)
    Switch $iRnd
    GUICtrlSetData($Edit1, $Antworten[$i])
    EndIf
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Gibt jedoch immer noch eine Fehlermeldung. >.> Woher bekomme ich diese Console?

    Einmal editiert, zuletzt von White (15. Juni 2011 um 22:57)

  • Falsche verschachtelung zwischen Zeile 29 und 37. For Schleife schliessen, Switch ohne Case, EndSwitch vor die EndIfs.

    Mit Konsole ist die Ausgabe von SciTE gemeint. Das kleine Fenster das beim Ausführen des Skripts unterhalb des Editors eingeblendet wird.

    Edit:
    Um hier irgendwann mal zum Abschluss zu kommen:
    1. Was soll das Tool machen.
    2. Gibt es eine Vorlage dieser ominösen Textdatei?

  • So habe es nochmal überarbeitet, jedoch gibt es immer noch eine Fehlermeldung, obwohl ich doch WEnd auch da habe.

    Script :

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("", 620, 657, 182, 144, $WS_POPUP)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 633, 529)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 0, 560, 513, 21)
    $senden = GUICtrlCreateButton("senden", 528, 560, 75, 25, $WS_GROUP)
    $Beenden = GUICtrlCreateButton("Beenden", 528, 608, 75, 25, $WS_GROUP)
    $Pic1 = GUICtrlCreatePic("Background.jpg", 0, 520, 636, 360, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)

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

    Local $sBuffer
    Dim $Text
    Dim $Fragen
    Dim $Antworten
    _FileReadToArray("Antwort.txt", $Fragen)
    _FileReadToArray("Frage.txt", $Antworten)

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

    While (TRUE)
    Switch (GUIGetMsg( ))
    Case $senden
    $Antworten = GuiCtrlRead($Input1)
    For $i = 1 To UBound($Fragen) - 1
    If $Fragen[$i] = $Antworten Then
    If StringRegExp ($Antworten, $Fragen[$i]) Then
    Local $iRnd = Random(1, 2, 1)
    Switch $iRnd
    GUICtrlSetData($Edit1, $Antworten[$i])
    EndSwitch
    EndIf
    EndIf
    Next
    WEnd

    [/autoit]
  • Syntaktisch korekt wäre es so. Wenn du SciTE4AutoIt verwendest, dann drück ab und zu mal Strg+T. Dann fallen dir solche Fehler schneller auf.

    Spoiler anzeigen
    [autoit]

    #region - Timestamp
    ;2011-06-15 23:09:45
    #endregion - Timestamp

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

    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("", 620, 657, 182, 144, $WS_POPUP)
    $Edit1 = GUICtrlCreateEdit("", 0, 0, 633, 529)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("", 0, 560, 513, 21)
    $senden = GUICtrlCreateButton("senden", 528, 560, 75, 25, $WS_GROUP)
    $Beenden = GUICtrlCreateButton("Beenden", 528, 608, 75, 25, $WS_GROUP)
    $Pic1 = GUICtrlCreatePic("Background.jpg", 0, 520, 636, 360, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)

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

    Local $sBuffer
    Dim $Text
    Dim $Fragen
    Dim $Antworten
    _FileReadToArray("Antwort.txt", $Fragen)
    _FileReadToArray("Frage.txt", $Antworten)

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

    While 1
    Switch GUIGetMsg()
    Case $senden
    $Antworten = GUICtrlRead($Input1)
    For $i = 1 To UBound($Fragen) - 1
    If $Fragen[$i] = $Antworten Then
    If StringRegExp($Antworten, $Fragen[$i]) Then
    $iRnd = Random(1, 2, 1)
    Switch $iRnd
    ; hier fehlt mindestens ein Case
    GUICtrlSetData($Edit1, $Antworten[$i])
    EndSwitch
    EndIf
    EndIf
    Next
    EndSwitch
    WEnd

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


    Lies mein Edit in meinem letzten Beitrag.

  • Danke. Also es lässt sich schon mal starten, aber leider läuft es nicht so, wie ich es gerne hätte. Ärgerlich `;..;´.

    Das Tool soll zusagen so, wie der Cleverbot ( ist nicht so ein Bot, wie du denkst.. eigtl kann man ihn nicht als Bot bezeichnet ) funktionieren, also dass er mit einem schreibt, indem er auf bestimmte Wörter im Input reagiert und dann eine dazu passende Antwort sendet, wovon es wieder Zufallsantworten gibt. Link zum Cleverbot , damit du verstehst, was ich meine : klick mich

    Im Anhang ist ein Script, so wie es funktionieren soll, nur dieses Mal soll er die Antworten und Fragen aus einer Textdatei lesen.

  • Ich schau mir das Skript heut nicht mehr an, will in's Bett.
    Du willst eine Frage eingeben und das Skript soll eine dazu passende Antwort geben?

    1. INI erstellen. Eine Sektion

    Code
    [Cleverbot]
    frage1=antwort1
    frage2=antwort2
    .
    .
    .


    2. Das Skript liest per IniReadSection() die Sektion Cleverbot ein. Ergebnis ist ein 2d Array.
    3. Eingabe der Frage entgegennehmen.
    4. Die erste Spalte des Arrays nach der Frage abgrasen (FOR $i=1 to $aIni[0][0])

    Der Bot wird natürlich cleverer, wenn man die eingegebene Frage vorher zerlegt und nach Mustern sucht, z.B. Fragewörter. Dadurch könnte man schinmal einen Teil der vorhandenen Fragen aussortieren. Danach nach den einzelnen Wörtern der eingegeben Frage im Array suchen. Bei jedem Fund einen Zähler für das Arrayelement hochzählen. Wurde das gesammte Array durchsucht, wird die Antwort von dem Index ausgegeben, der den höchsten Zähler hat.

    Das wär jetzt meine erste, grobe Idee.

    Edit:
    Denkbar und warscheinlich auch sinnvoller für einen grossen Datenbestand wäre eine SQL Datenbank. Text und Inidateien sind in ihrer Grösse limitiert.

  • Danke für die schnelle Antwort.

    Ich lese mir dann gleich mal paar Tutorials über INIs durch und dann versuche ich es mal.

    MfG White