Textdatei nach einem String durschsuchen

  • Hi Leute,

    ich will eine Textdatei mit ~130.000 Zeilen nach einem String durschsuchen. Wenn dieser in einer Zeile gefunden wurde, als Beispiel ist die Zeile:

    C:\Programme\AutoIt\AutoIt3.exe

    Wir suchen nach "AutoIt". Wenn der String gefunden wurde, soll die Zeile, in der der String gefunden wurde in ein Array gepackt werden. Dann soll es weitersuchen bis es fertig ist, das ganze soll dann mit allen gefunden Zeilen als Array zurückgegeben werden.

    Wisst ihr wie ich soetwas realisieren kann? Ich muss nicht mit einer .txt arbeiten, wenn ihr eine bessere Idee habt nur zu, denn die hab ich nötig...

    Einmal editiert, zuletzt von BurakSZ (30. Juni 2010 um 11:59)

  • FileReadLine, StringInStr und eine Countervariable.
    Wenn gefunden dann diese dem Array hinzufügen (z.B. mit ReDim).
    Ich persönlich würde statt direkt mit nem ReDim das Array zu vergrößern wohl eine Queue oder ein String nehmen und das ganze dann erst am Ende zu nem Array umformen.

    Ich muss nicht mit einer .txt arbeiten, wenn ihr eine bessere Idee habt nur zu

    Wie sollen wir das wissen?
    Die einzige Information die du uns gibst: "Ich muss eine Textdatei durchsuchen!"
    Ergo brauchst du anscheinend doch unbedingt eine Textdatei.
    Wo die Daten herkommen sagst du uns ja nicht.

    Einmal editiert, zuletzt von AspirinJunkie (30. Juni 2010 um 11:41)

  • ich hatte mal n ähnliches Problem

    hier ist eine Funktion aus nem Programm,

    Es durchsucht eine *.log Datei nach dem zuletzt eingetragenen EAN

    da die Dateien recht groß werden wird hier von hinten her gearbeitet

    vielleicht bringt's dich ja auf den richtigen weg ;)

    Spoiler anzeigen
    [autoit]


    Func _get_last_log_ean($file)

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

    $start = TimerInit() ;startet sicherheitstimer

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

    $file = FileRead($file)

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

    ;$ret = StringRegExp(FileRead($file), 'EAN-Code: \d+', 3)
    $ret = StringRegExp($file, '(?:EAN-Code: )(\d+)', 3)

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

    #cs

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

    '(?:EAN-Code: )(\d+)' - ist das Suchmuster (Pattern)
    (?:EAN-Code: ) - erster Ausdruck in Klammern (Backreferenz) dient zum Finden des Strings (EAN...)
    ?: ist die Anweisung: diese Backreferenz im Ergebnis nicht aufführen
    (\d+) - zweite Backreferenz, ist zu berücksichtigen.
    \d bedeutet Ziffer, + ist ein Quantifier und heißt mindestens 1-mal bis beliebig oft

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

    #ce

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

    ;_ArrayDisplay($ret)

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

    $letzter_eintrag = UBound($ret) - 1

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

    $ean = $ret[$letzter_eintrag]

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

    ;ConsoleWrite($ean & @CRLF)

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

    ;ConsoleWrite('Zeit: ' & TimerDiff($start) & @CRLF)

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

    Local $return[3]
    $return[1] = $ean
    $return[2] = TimerDiff($start)
    Return $return

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

    EndFunc ;==>_get_last_log_ean

    [/autoit]
  • Ich glaub wohl es reicht zu sagen:

    C:\Programme\AutoIt\AutoIt3.exe

    Und ca. 130.000 Zeilen. Jede Zeile ein pfad. ich mein man könnte ja sagen dass eine 130.000 zeilige textdatei nicht für soetwas geeignet ist und eine andere datei besser dafür geeignet ist. naja hab meine lösung gefunden, _arrayfindall

    [autoit]

    Func _FileFindAll($sPath, $sString)
    $iElements = _FileCountLines($sPath)
    Dim $aFile[$iElements]
    _FileReadToArray($sPath, $aFile)
    $aFound = _ArrayFindAll($aFile, $sString, 1, 0, 0, 1)
    If $aFound = -1 Then
    SetError(1)
    Return ""
    Else
    Return $aFound
    EndIf
    EndFunc

    [/autoit]
  • Die Daten werden mit einer Funktion vorher geschrieben, ich glaub sogar du kennst diese Funktion sehr gut, da du sie auch mal geschrieben hast. _FilesListRekursiv, die Funktion von kleiner27. Du hast auch mal eine Funktion geschrieben, die so ähnlich war, deine hat aber nur den Pfad des erstgefunden Übereinstimmung zurückgegeben, das war der kleine aber auch wichtige unterschied^^

  • Spoiler anzeigen
    [autoit]

    Func _unkreativ($file, $ssearch)
    local $sreadline, $sret
    local $hfile=FileOpen($file, 0)
    While True
    $sreadline = FileReadLine($hFile)
    If @error Then ExitLoop
    if StringInStr($sreadline, $ssearch) then $sret &= '|'&$sreadline
    wend
    FileClose($hFile)
    return Stringsplit(StringtrimLeft($sret,1), "|")
    endfunc

    [/autoit]


    Sowas?

  • Danke das du trotzdem noch versuchst mir zu helfen, aber ich bin schon auf die Lösung gekommen ^^. Trotzdem danke.