Zeile pro Zeile suchen -> Performance verbessern

  • Hallo,

    ich möchte eine Datei mit ca. 10.000 Zeilen nach diversen Wörtern durchsuchen (Zeile pro Zeile).
    Im Prinzip funktioniert alles nur es ist ein wenig langsam.
    Aktuell suche ich nach fünf Wörtern und da lauft das Script 55 Sekunden. Mein Ziel ist es nach ca. 50 Wörtern zu suchen.
    Hat wer eine Idee wie ich das ganze schneller bekomme?

    $sum = 5
    for $i=0 To _FileCountLines($file)
    $suchZeile=FileReadLine($file,$i)
    $a = 0
    do
    $a = $a + 1
    If StringInStr($suchZeile,$suchString[$a]) then
    MsgBox (0,"Gefunden", $suchString[$a])
    EndIf
    until $a > $sum
    Next

    Danke,
    -josi

    Einmal editiert, zuletzt von Josi (3. Mai 2010 um 23:48)

  • Die Datei in ein Array einlesen und gibt es eine andere Methode um sie komplett einzulesen?

  • Hier ist noch ein Beispiel, wie man ein Wort samt dem beinhaltenden Satz per StringRegExp ausliest. Der Post ist schon ein bisschen angestaubt (Aus nem anderen Forum, da man Links ja ungerne sieht), und nur schnell rüberkopiert, deswegen gibts mit sehr hoher Wahrscheinlichkeit die Möglichkeit, vieles kürzer zu schreiben. Hab nicht wirklich drübergeschaut, da ich lang genug mit suchen beschäftigt war, und jetzt weg muss :D

    Spoiler anzeigen

    Hier ein Beispiel für GUICtrlRead:

    Spoiler anzeigen
    [autoit]

    #include <GuiEdit.au3>
    $hGUI = GUICreate("")
    $hEdit = GUICtrlCreateEdit( _
    "Er hörte leise Schritte hinter sich. Das bedeutete " & @CRLF & _
    "nichts Gutes. Wer würde ihm schon folgen, spät in der " & @CRLF & _
    "Nacht und dazu noch in dieser engen Gasse mitten im übel " & @CRLF & _
    "beleumundeten Hafenviertel? Gerade jetzt, wo er das " & @CRLF & _
    "Ding seines Lebens gedreht hatte und mit der Beute " & @CRLF & _
    "verschwinden wollte! Hatte einer seiner zahllosen Kollegen " & @CRLF & _
    "dieselbe Idee gehabt, ihn beobachtet und abgewartet, " & @CRLF & _
    "um ihn nun um die Früchte seiner Arbeit zu erleichtern? " & @CRLF & _
    "Oder gehörten die Schritte hinter ihm zu einem der " & @CRLF & _
    "unzähligen Gesetzeshüter dieser Stadt, und die stählerne " & @CRLF & _
    "Acht um seine Handgelenke würde gleich zuschnappen? " & @CRLF & _
    "Er konnte die Aufforderung stehen zu bleiben schon " & @CRLF & _
    "hören. Gehetzt sah er sich um. Plötzlich erblickte " & @CRLF & _
    "er den schmalen Durchgang. Blitzartig drehte er sich " & @CRLF & _
    "nach rechts und verschwand zwischen den beiden Gebäuden. " & @CRLF & _
    "Beinahe wäre er dabei über den umgestürzten Mülleimer " & @CRLF & _
    "gefallen, der mitten im Weg lag. Er versuchte, sich " & @CRLF & _
    "in der Dunkelheit seinen Weg zu ertasten und erstarrte: " & @CRLF & _
    "Anscheinend gab es keinen anderen Ausweg aus diesem " & @CRLF & _
    "kleinen Hof als den Durchgang, durch den er gekommen" & @CRLF & _
    "war.", 20, 20, 360, 320)
    $hInput = GUICtrlCreateInput("Suche nach...", 20, 360, 260, 20)
    $hButton = GUICtrlCreateButton("Suchen", 300, 360, 70, 20)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $hButton
    $iPos = StringInStr(GUICtrlRead($hEdit), GUICtrlRead($hInput))
    If $iPos Then
    $aTmp = StringRegExp(GUICtrlRead($hEdit), "(?i)(?<=^|[\!\.\?])[^\?\.\!]*" & GUICtrlRead($hInput) & "[^\?\.\!]*[\?\.\!]", 3)
    If IsArray($aTmp) Then
    MsgBox(0, "", _
    "Gefunden, an der Position " & $iPos & @CRLF & @CRLF & _
    "Innerhalb des folgenden Satzes: " & @CRLF & $aTmp[0])
    Else
    MsgBox(0, "", "Gefunden, an der Position " & $iPos)
    EndIf
    Else
    MsgBox(0, "", "Leider nicht gefunden")
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Und hier eines für _IEBodyReadHTML/_IEBodyReadText.

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    $hGUI = GUICreate("", 240, 90)
    $hInput = GUICtrlCreateInput("Suchen nach...", 20, 20, 200, 20)
    $hButton = GUICtrlCreateButton("Auf zufälliger Wiki Seite suchen", 20, 50, 200, 20)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $hButton
    $oIE = _IECreate("http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite")
    $iPosHTML = StringInStr(_IEBodyReadHTML($oIE), GUICtrlRead($hInput))
    $iPosTEXT = StringInStr(_IEBodyReadText($oIE), GUICtrlRead($hInput))
    MsgBox(0, "", "Im Text: " & $iPosTEXT & @CRLF & "Im Quelltext: " & $iPosHTML)

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

    $aTmp = StringRegExp(_IEBodyReadText($oIE), "(?i)(?<=^|[\!\.\?])[^\?\.\!]*" & GUICtrlRead($hInput) & "[^\?\.\!]*[\?\.\!]", 3)
    If IsArray($aTmp) Then MsgBox(0, "", "Im Text in folgendem Satz gefunden: " & @CRLF & $aTmp[0])

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

    $aTmp = StringRegExp(_IEBodyReadHTML($oIE), "(?is)<P>.*?" & GUICtrlRead($hInput) & ".*?</P>", 3)
    If IsArray($aTmp) Then MsgBox(0, "", "Im Quelltext in folgendem Abschnitt gefunden: " & @CRLF & $aTmp[0])

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

    _IEQuit($oIE)
    EndSwitch
    WEnd

    [/autoit]
  • cool.
    Ich lese das File jetzt in ein Array ein und bin auf 2 Sekunden.

    So gefällt mir das : - ) :rock: