Wortsuche+Zeilenausgabe aus txt'

  • Hallo,
    ich bin dabei ein Script zu schreiben, komme aber nicht weiter. Der Zweck dieses Scriptes ist es ein vom Benutzer eingegebens Wort in einer TXT Datei zu suchen und dann die komplette Zeile (in welcher das Wort steht) auszugeben. Ich habe hierzu ein Gui erstellt, welches die Ein- und Ausgabe benutzerfreundlicher machen soll.

    Ich habe schon einige Versuche mit _FileReadToArray und _ArraySearch gemacht kam aber nie zu einem vernünftigen Ergebnis. Gibt es vielleicht eine Funktion die auf direcktem Wege eine TXT nach einer Zeichenkette durchsucht und dann die ganze Zeile ausgibt?

    Hoffe auf Hilfe

    Einmal editiert, zuletzt von Vinschni (16. November 2006 um 14:31)

    • Offizieller Beitrag

    Hi,

    hier mal einBsp: Nicht schön aber selten und zeigt den Weg:

    [autoit]

    #include <file.au3>
    #include <Array.au3>
    Dim $aRecords
    If Not _FileReadToArray("test.txt", $aRecords) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    while 1
    MsgBox(0,"Found In Line", returnLineIfWordFound(InputBox("Suchwort", "Gib das Wort ein; ")))
    Sleep(1000)
    WEnd

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

    Func returnLineIfWordFound($search)
    For $x = 1 To $aRecords[0]
    If StringInStr($aRecords[$x], $search) <> 0 Then Return $aRecords[$x]
    Next
    return "Not found"
    EndFunc ;==>returnLineIfWordFound

    [/autoit]

    So long,

    Mega

  • Du hast gerade den Award für den schönsten Func namen gewonnen :schild4:

    €€ dein Exit funktioniert nicht, und wenn man auf [X] klickt, startet er ne suche^^ bei ereignissanzeige der suche kommt aber nix :hammer:

    schau dir das noch mal an^^

    Einmal editiert, zuletzt von huggy (16. November 2006 um 14:49)

  • War ja keine Kritik :kiss:

    Bist eben Phantasievoll und denkst immer an die anderen


    :kiss: :kiss: :kiss: :kiss: :kiss: :kiss:

  • Herzlichen Dank an th.meger für die schnelle Antwort,
    ich hätte nur noch eine Frage.
    Wie kann ich dass am besten mit meiner GUI kombinieren?

    Gruß vinschni

    • Offizieller Beitrag

    Hi!

    Bisschen weiter in Richtung GUI (Grundgerüst von huggy, Fixes von mir):

    [autoit]

    #include <file.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>

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

    GUICreate("Lateinvocabeldatenbanksuche", 305, 250)
    GUISetState(@SW_SHOW)

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

    Global $ergebniss
    Global $aRecords[100]

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

    $schliesen1 = GUICtrlCreateButton("Schließen", 236, 214, 62, 31, -1, -1)
    $ergebnisanzeige2 = GUICtrlCreateEdit($ergebniss & @CRLF, 1, 104, 304, 107, $ES_AUTOVSCROLL + $WS_VSCROLL)
    $suchen3 = GUICtrlCreateProgress(2, 213, 213, 14, -1, -1)
    $Suche4 = GUICtrlCreateButton("Suchen", 236, 77, 62, 20, -1, -1)
    $hilfe5 = GUICtrlCreateButton("Hilfe", 260, 6, 38, 22, -1, -1)
    $anweisung6 = GUICtrlCreateLabel("Bitte geben sie die lateinische Bedeutung des gesuchten Worts hier ein:", 6, 6, 227, 26, -1, -1)
    $eingabe7 = GUICtrlCreateInput("Wort", 2, 35, 303, 19, -1, -1)
    $label8 = GUICtrlCreateLabel("Ergebnissanzeige der Suche:", 4, 86, 186, 13, -1, -1)

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $schliesen1
    Exit
    Case $msg = $hilfe5
    MsgBox(0, "Hilfe & Über", "blablabla")
    Case $msg = $Suche4
    MsgBox(0, "Found In Line", returnLineIfWordFound(GUICtrlRead($eingabe7)))
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

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

    Func returnLineIfWordFound($search)
    $ergebniss = "nein"

    _FileReadToArray(@ScriptDir & "\test.txt", $aRecords)
    ;~ _ArrayDisplay($aRecords, "REc")
    ;~ MsgBox(0, '', $search)

    For $x = 1 To $aRecords[0]
    If StringInStr($aRecords[$x], $search) <> 0 Then $ergebniss = $aRecords[$x]
    Next

    Return $ergebniss
    EndFunc ;==>returnLineIfWordFound

    [/autoit]

    peethebee

  • HallO!

    Hier nochmal die Überarbeite Version von peethebee und mir!

    Hab noch Die anzeige richtig eingefügt und Den Progress bar eingestellt!

    [autoit]

    #include <file.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>


    Global $datei = FileOpenDialog("Text Datei auswählen!", @DesktopDir, "Textdokument (*.txt)")

    GUICreate("Lateinvocabeldatenbanksuche", 305, 250)
    GUISetState(@SW_SHOW)

    Global $ergebniss
    Global $aRecords[100]


    $schliesen1 = GUICtrlCreateButton("Schließen", 236, 214, 62, 31, -1, -1)
    $ergebnisanzeige2 = GUICtrlCreateEdit("" & @CRLF, 1, 104, 304, 107, $ES_AUTOVSCROLL + $WS_VSCROLL)
    $progress = GUICtrlCreateProgress(2, 213, 213, 14, -1, -1)
    $Suche4 = GUICtrlCreateButton("Suchen", 236, 77, 62, 20, -1, -1)
    $hilfe5 = GUICtrlCreateButton("Hilfe", 260, 6, 38, 22, -1, -1)
    $anweisung6 = GUICtrlCreateLabel("Bitte geben sie die lateinische Bedeutung des gesuchten Worts hier ein:", 6, 6, 227, 26, -1, -1)
    $eingabe7 = GUICtrlCreateInput("Bitte Hier dein Wort eingeben!", 2, 35, 303, 19, -1, -1)
    $label8 = GUICtrlCreateLabel("Ergebnissanzeige der Suche:", 4, 86, 186, 13, -1, -1)

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



    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $schliesen1
    Exit
    Case $msg = $hilfe5
    MsgBox(0, "Lateinvocabeldatenbanksuche", "by: vinschni " & @CRLF & "th.meger" & @CRLF & "peethebee" & @Crlf & "Huggy")
    Case $msg = $Suche4
    GUICtrlSetData($ergebnisanzeige2, returnLineIfWordFound(GUICtrlRead($eingabe7)))

    $s = "0"

    For $i = $s To 100


    GUICtrlSetData ($progress,$i)
    sleep(20)

    If GUICtrlRead($progress) = 100 Then


    TrayTip("Fertig", "Die Suche nach " & GUICtrlRead($eingabe7) & " ist abgeschlossen!", 5)


    Endif

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

    Next

    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    ; process

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


    Func returnLineIfWordFound($search)


    _FileReadToArray($datei, $aRecords)
    ;~ _ArrayDisplay($aRecords, "REc")
    ;~ MsgBox(0, '', $search)

    For $x = 1 To $aRecords[0]
    If StringInStr($aRecords[$x], $search) <> 0 Then $ergebniss = $ergebniss & @Crlf & $aRecords[$x]
    Next

    Return $ergebniss


    ;GUICtrlSetData($ergebnisanzeige2, $ergebniss)
    EndFunc ;==>returnLineIfWordFound

    [/autoit]


    €€ Noch ein paar Sachen verbessert, wie zb Anzeige von mehreren
    Ergebnissen untereinander (danke @ peethebee =) ) , und benachrichtigung wenn Suche fertig :party3: :party4:

    Grüße!

    Einmal editiert, zuletzt von huggy (16. November 2006 um 17:07)

    • Offizieller Beitrag

    Hi,

    nur eine kleine Anmerkung. Wenn die Datei eh nicht wählbar ist, dann sollte sie nicht bei jedem neuen Durchgang wieder gelesen werden, oder?

    Außerdem wird das gefundene Wort schon angezeigt, bevor der Progressbalken durch ist. :rolleyes:

    Na ja, ich weiß ihr habe nur zeigen wollen wie geht. :teufel:

    So long,

    Mega

  • Sicher ist sie wählbar??

    Global $datei = FileOpenDialog("Text Datei auswählen!", @DesktopDir, "Textdokument (*.txt)")

    und


    _FileReadToArray($datei, $aRecords)


    deswegen wird man nur aufgefordert eine neue zu wählen, wenn das Script neu gestartet wurde (!)


    p.s das mit dem progress balken hab ich nur der Optik wegen gemacht, und um zu zeigen wie es geht *looool* oder anders:

    ich war zu faul bzw weiß nichtmal ob ich es schaffe, dass der balken erst voll ist, wenn ALLES durchgesucht wurde^^


    Grüße, huggy :)

  • omg hast du das selber geschrieben????

    Oder aus dem netz =)

    €€ hab gerade gesehen , das wenn man mehrere sahcen eingibt und den log löscht, er immer wieder kommt.. stört das oder ist das egal?

    Einmal editiert, zuletzt von huggy (16. November 2006 um 18:20)

    • Offizieller Beitrag

    Hi,

    wenn du den part so änderst, dann werden die Ergebnisse erst zum Schluss angezeigt. Keine Ahnung, ob das gewollt ist. ;)

    [autoit]

    $re = returnLineIfWordFound(GUICtrlRead($eingabe7))
    For $i = 0 To 100
    GUICtrlSetData($progress, $i)
    Sleep(20)
    If GUICtrlRead($progress) = 100 Then
    TrayTip("Fertig", "Die Suche nach " & GUICtrlRead($eingabe7) & " ist abgeschlossen!", 5)
    EndIf
    Next
    GUICtrlSetData($ergebnisanzeige2, $re)

    [/autoit]

    So long,

    Mega

  • Ja, ich hab die Vocabeln mit hilfe meiner Kameraden und einer Vocabellernsoftware eingegeben. Die sind aus unseren Lateinbüchern. Und ich denke es spielt keine große Rolle mit dem Fortschrittsbalken, da es sich zur Not ja ch so interpretieren lassen würde dass eben noch nach weiteren übereinstimmungen gesucht wird, aber mit der Lösung von th.meger ist dass ja auch toll geworden, oder?

    Ich möchte mich bei euch allen für die große Hilfe bedanken, so hätt ich dass nie hinbekommen. :klatschen: :klatschen: :klatschen:

    Ich hab noch ein paar Kleinigkeiten geändert:

    [autoit]

    #include <file.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>


    Global $datei = FileOpenDialog("Vocabeldatenbank auswählen", @DesktopDir, "Lateinvoc.Dok (*.txt)")
    HotKeySet ( "{ENTER}", "suchen" )
    GUICreate("Lateinvocabeldatenbanksuche", 305, 250)
    GUISetState(@SW_SHOW)

    Global $ergebniss
    Global $aRecords[100]


    $schliesen1 = GUICtrlCreateButton("&Schließen", 236, 214, 62, 31, -1, -1)
    $ergebnisanzeige2 = GUICtrlCreateEdit("" & @CRLF, 1, 104, 304, 107, $ES_AUTOVSCROLL + $WS_VSCROLL)
    $progress = GUICtrlCreateProgress(2, 213, 213, 14, -1, -1)
    $Suche4 = GUICtrlCreateButton("Suchen", 236, 77, 62, 20, -1, -1)
    $hilfe5 = GUICtrlCreateButton("&Hilfe", 260, 6, 38, 22, -1, -1)
    $anweisung6 = GUICtrlCreateLabel("Bitte geben sie die lateinische Bedeutung des gesuchten Worts hier ein:", 6, 6, 227, 26, -1, -1)
    $eingabe7 = GUICtrlCreateInput("Bitte gesuchten Begriff hier eingeben!", 2, 35, 303, 19, -1, -1)
    $label8 = GUICtrlCreateLabel("Ergebnissanzeige der Suche:", 4, 86, 186, 13, -1, -1)
    $label9 = GUICtrlCreateLabel("", 2, 230,235 ,13, -1, -1)
    GUICtrlSetFont($label9, 7)

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $schliesen1
    Exit
    Case $msg = $hilfe5
    MsgBox(0, "Lateinvocabeldatenbanksuche", "by: vinschni " & @CRLF & "th.meger" & @CRLF & "peethebee" & @Crlf & "Huggy")
    Case $msg = $Suche4
    call("suchen")
    Func suchen()
    $re = returnLineIfWordFound(GUICtrlRead($eingabe7))
    For $i = 0 To 100
    GUICtrlSetData($progress, $i)
    Sleep(15)
    If GUICtrlRead($progress) = 100 Then
    GUICtrlSetData($label9, "Die Suche nach <" & GUICtrlRead($eingabe7) & "> ist abgeschlossen!" )

    EndIf
    Next

    GUICtrlSetData($ergebnisanzeige2,$re, "-")
    EndFunc
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    ; process




    Func returnLineIfWordFound($search)


    _FileReadToArray($datei, $aRecords)
    ;~ _ArrayDisplay($aRecords, "REc")
    ;~ MsgBox(0, '', $search)

    For $x = 1 To $aRecords[0]
    If StringInStr($aRecords[$x], $search) <> 0 Then $ergebniss = $ergebniss & @Crlf & $aRecords[$x]
    Next

    Return $ergebniss


    ;GUICtrlSetData($ergebnisanzeige2, $ergebniss)
    EndFunc ;==>returnLineIfWordFound

    [/autoit]


    Mir ist aber noch ein Mangel aufgefallen, im Ausgabefenster werden die Ergebnisse der Suche immer angehängt, so dass man nach 2, 3 Suchen den Überblick verliert. Lässt sich das EDIT nicht vor jeder neuen ausgabe "zurücksetzten"?

    Einmal editiert, zuletzt von Vinschni (17. November 2006 um 09:49)

    • Offizieller Beitrag

    Hi,

    ich habe mal deine Fehler ausgebaut. Mir fallen da noch einige Verbesserungsmöglichkeiten ein, aber heute muss ich erstmal meine Geb-Party organisieren. :klatschen:

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>

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

    Global $datei = FileOpenDialog("Vocabeldatenbank auswählen", @DesktopDir, "Lateinvoc.Dok (*.txt)")
    HotKeySet("{ENTER}", "suchen")
    GUICreate("Lateinvocabeldatenbanksuche", 305, 250)
    GUISetState(@SW_SHOW)

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

    Global $ergebniss
    Global $aRecords[100]

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

    $schliesen1 = GUICtrlCreateButton("&Schließen", 236, 214, 62, 31, -1, -1)
    $ergebnisanzeige2 = GUICtrlCreateEdit("" & @CRLF, 1, 104, 304, 107, $ES_AUTOVSCROLL + $WS_VSCROLL)
    $progress = GUICtrlCreateProgress(2, 213, 213, 14, -1, -1)
    $Suche4 = GUICtrlCreateButton("Suchen", 236, 77, 62, 20, -1, -1)
    $hilfe5 = GUICtrlCreateButton("&Hilfe", 260, 6, 38, 22, -1, -1)
    $anweisung6 = GUICtrlCreateLabel("Bitte geben sie die lateinische Bedeutung des gesuchten Worts hier ein:", 6, 6, 227, 26, -1, -1)
    $eingabe7 = GUICtrlCreateInput("Bitte gesuchten Begriff hier eingeben!", 2, 35, 303, 19, -1, -1)
    $label8 = GUICtrlCreateLabel("Ergebnissanzeige der Suche:", 4, 86, 186, 13, -1, -1)
    $label9 = GUICtrlCreateLabel("", 2, 230, 235, 13, -1, -1)
    GUICtrlSetFont($label9, 7)

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $schliesen1
    Exit
    Case $msg = $hilfe5
    MsgBox(0, "Lateinvocabeldatenbanksuche", "by: vinschni " & @CRLF & "th.meger" & @CRLF & "peethebee" & @CRLF & "Huggy")
    Case $msg = $Suche4
    suchen()
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

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

    Func suchen ()
    GUICtrlSetData($ergebnisanzeige2, "")
    $re = returnLineIfWordFound(GUICtrlRead($eingabe7))
    For $i = 0 To 100
    GUICtrlSetData($progress, $i)
    Sleep(15)
    If GUICtrlRead($progress) = 100 Then GUICtrlSetData($label9, "Die Suche nach <" & GUICtrlRead($eingabe7) & "> ist abgeschlossen!")
    Next
    GUICtrlSetData($ergebnisanzeige2, $re, "-")
    EndFunc ;==>suchen

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

    Func returnLineIfWordFound($search)
    _FileReadToArray($datei, $aRecords)
    For $x = 1 To $aRecords[0]
    If StringInStr($aRecords[$x], $search) <> 0 Then $ergebniss = $ergebniss & @CRLF & $aRecords[$x]
    Next
    Return $ergebniss
    EndFunc ;==>returnLineIfWordFound

    [/autoit]

    So long,

    Mega

  • Da wünsch ich dir ja mal alles gute nachträglich. :party: und noch viel Spaß heute.
    Die Dinge die du verbessert hast, bzw die ich "falsch" gemacht habe, machen die viel bei der Ausführung aus? (z.B. das ich die suchen() Func in den $Suche4 aufruf reingepackt hab)

  • Um zu verhindern dass suchergebnisse angehängt werden dachte ich daran dass Gui vor der Ausgabe der neuen Suchergebnisse zu zerstören und wieder neu aufzurufen, nun wir aber vor der ausgabe wieder zum anfang zurückgesprungen und somit kommt es nicht einmal zur Ausgabe. Gibt es eine elegantere Lösung um vor der Ausgabe neuer Suchergebnisse die alten zu löschen?