.txt Dateien besonders auslesen

  • Da ich mich nicht sehr gut auskenne mit AutoIt (nur die Grundlagen) wollte ich mal fragen ob es möglich ist mit AutoIt einen Ordner nach .txt Dateien durchsuchen zulassen und diese dann nach Wörtern aus einem Input zu durchsuchen. Danach sollte es die Datei in das aktuelle Datum, Uhrzeit umbennen am Dateinamenende die gefundenen Worte schreiben.
    Danke für eure Hilfe im vorraus.

    Einmal editiert, zuletzt von fanboi (28. Februar 2009 um 10:33)

  • Hallo fanboi!

    das ist kein großes Problem, hier gibts auch sicher Hilfe dazu, aber ein bischen sollte vom Fragesteller schon kommen.
    Wo hängst Du jetzt, beim Auslesen des Verzeichnisses oder beim Verarbeiten der Einzeldateien??
    zumindest über den großen Ablauf muß man sich schon gedanken machen.

    Kennst Du grep -l (Unix/linux) der kann z.B. nach allen *.txt mit dem Wort "ERROR" suchen und gibt die Dateinamen aus, langt das evtl. auch schon?? (das wär dann flexibler Einzusetzen).

    Wie soll Dein Input sein, ne Tabelle, ein Eingabefeld, ein Begriff, mehrere Begriffe??

    Grüße

    German

  • Ich habe gerade vor ein paar Tagen ein Script zum Suchen von mehreren Begriffen in Textdateien geschrieben. Ich such damit MP3-Titel in Inhaltsangaben.

    Ggf. kannst Du es ja als Ausgangsbasis verwenden.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListBox.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>

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


    #Region ### START Koda GUI section ### Form=MP3Suche.kxf
    $Main_GUI = GUICreate("MP3 Suche", 715, 559, 193, 115)
    $Suchbegriffe_ID = GUICtrlCreateInput("", 116, 4, 513, 21)
    $Suchliste_ID = GUICtrlCreateList("", 4, 60, 349, 487)
    $StartSuche_ID = GUICtrlCreateButton("Start...", 324, 36, 65, 21, 0)
    $Trefferliste_ID = GUICtrlCreateList("", 360, 60, 349, 487)
    $Label_In_ID = GUICtrlCreateLabel("Suchen in", 8, 36, 84, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    $Treffer_Label_ID = GUICtrlCreateLabel("Treffer", 648, 36, 58, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    $Suchbegriffe_Label_ID = GUICtrlCreateLabel("Suchbegriffe", 8, 4, 107, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    $Suchliste_waehlen_ID = GUICtrlCreateButton("wählen...", 92, 36, 65, 21, 0)
    ;GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $Anzeigeliste_ID = GUICtrlCreateList("",4,60,705,487)
    GUICtrlSetState($Anzeigeliste_ID,$GUI_HIDE)
    $EndeSuche_ID = GUICtrlCreateButton("Ende",8,36,65,21,0)
    GUICtrlSetState($EndeSuche_ID,$GUI_HIDE)
    GUISetState(@SW_SHOW)

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    Global $begriffe

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

    Case $GUI_EVENT_CLOSE
    Exit

    Case $Suchliste_waehlen_ID
    GUICtrlSetData($Suchliste_ID,"")
    $SelectFiles = FileOpenDialog("'SHIFT' benutzen um mehrere Dateien auszuwählen...","E:\Listen\MP3\","Listen(*.txt)",4+1)
    If @error = 1 Then ContinueLoop
    If StringInStr($selectFiles,"|") Then
    Dim $aListView = StringSplit($SelectFiles,"|")
    For $i = 2 To $aListView[0]
    GUICtrlSetData($Suchliste_ID,$aListView[1] & "\" & $aListView[$i])
    Next
    Else
    GUICtrlSetData($Suchliste_ID,$SelectFiles)
    EndIf

    Case $StartSuche_ID
    $pos = WinGetPos("MP3 Suche")
    SplashTextOn("","Suche läuft...",200,50,$pos[0]+($pos[2]-200)/2,$pos[1]+($pos[3]-50)/2,33,"",14)
    Sleep(500)
    $begriffe = _SearchStringSplit(GUICtrlRead($Suchbegriffe_ID))

    If $begriffe[0] = 0 Then
    Msgbox(0,"Fehler...","Sie müssen schon wenigstens einen Suchbegriff eingeben !")
    Else
    $anzahl = _GUICtrlListBox_GetCount($Suchliste_ID)
    If $anzahl = 0 Then
    Msgbox(0,"Fehler...","Sie müssen mindestens eine Datei angeben, in der gesucht werden soll !")
    Else
    GUICtrlSetData($Trefferliste_ID,"")
    For $i = 0 To $anzahl - 1
    $aktuelleDatei = _GUICtrlListBox_GetText($Suchliste_ID,$i)
    $fileID = FileOpen($aktuelleDatei,0)
    While 1
    $zeile = FileReadLine($fileID)
    If @error Then ExitLoop
    If _BegriffeSuchen($begriffe,$zeile) = $begriffe[0] Then
    GUICtrlSetData($Trefferliste_ID,$aktuelleDatei)
    ExitLoop
    EndIf
    Wend
    FileClose($fileID)
    Next
    EndIf
    EndIf
    SplashTextOn("","Die Suche wurde abgeschlossen.",300,50,$pos[0]+($pos[2]-300)/2,$pos[1]+($pos[3]-50)/2,33,"",14)
    Sleep(1000)
    SplashOff()

    Case $EndeSuche_ID
    GUICtrlSetState($Suchbegriffe_ID,$GUI_ENABLE)
    GUICtrlSetState($Anzeigeliste_ID,$GUI_HIDE)
    GUICtrlSetState($EndeSuche_ID,$GUI_HIDE)
    GUICtrlSetState($Label_In_ID,$GUI_SHOW)
    GUICtrlSetState($StartSuche_ID,$GUI_SHOW)
    GUICtrlSetState($Treffer_Label_ID,$GUI_SHOW)
    GUICtrlSetState($Suchliste_ID,$GUI_SHOW)
    GUICtrlSetState($Suchliste_waehlen_ID,$GUI_SHOW)
    GUICtrlSetState($Trefferliste_ID,$GUI_SHOW)
    GUICtrlSetData($Anzeigeliste_ID,"")
    EndSwitch
    WEnd

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

    Func _SearchStringSplit($string)
    Local $suchbegriffe[1]
    If StringLen($string) > 0 Then
    $begriff = 1
    $i = 1
    ReDim $suchbegriffe[2]
    Do
    If StringMid($string,$i,1) = '"' Then
    Do
    $i += 1
    If $i <= StringLen($string) Then
    If StringMid($string,$i,1) = '"' Then
    If $suchbegriffe[Ubound($suchbegriffe)-1] <> "" Then
    $begriff +=1
    ReDim $suchbegriffe[Ubound($suchbegriffe)+1]
    EndIf
    $i += 1
    ExitLoop
    Else
    $suchbegriffe[$begriff] &= StringMid($string,$i,1)
    EndIf
    EndIf
    Until $i > StringLen($string)
    Else
    If StringMid($string,$i,1) = " " Then
    If $suchbegriffe[Ubound($suchbegriffe)-1] <> "" Then
    $begriff +=1
    ReDim $suchbegriffe[Ubound($suchbegriffe)+1]
    EndIf
    Else
    $suchbegriffe[$begriff] &= StringMid($string,$i,1)
    EndIf
    EndIf
    $i += 1
    Until $i > StringLen($string)
    If $suchbegriffe[Ubound($suchbegriffe)-1] = "" Then ReDim $suchbegriffe[Ubound($suchbegriffe)-1]
    $suchbegriffe[0] = UBound($suchbegriffe)-1
    EndIf
    Return $suchbegriffe
    EndFunc

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

    Func ListDblClick()
    Local $fileID, $zeile
    Local $selection = _GUICtrlListBox_GetCurSel($Trefferliste_ID)
    ;_GUICtrlListBox_SetCurSel($Trefferliste_ID,-1)
    $fileID = FileOpen(_GUICtrlListBox_GetText($Trefferliste_ID,$selection),0)
    GUICtrlSetState($Suchbegriffe_ID,$GUI_DISABLE)
    GUICtrlSetState($Label_In_ID,$GUI_HIDE)
    GUICtrlSetState($StartSuche_ID,$GUI_HIDE)
    GUICtrlSetState($Treffer_Label_ID,$GUI_HIDE)
    GUICtrlSetState($Suchliste_ID,$GUI_HIDE)
    GUICtrlSetState($Suchliste_waehlen_ID,$GUI_HIDE)
    GUICtrlSetState($Trefferliste_ID,$GUI_HIDE)
    GUICtrlSetState($Anzeigeliste_ID,$GUI_SHOW)
    GUICtrlSetState($EndeSuche_ID,$GUI_SHOW)
    While 1
    ;GUICtrlSetData($AnzeigeListe_ID,_GUICtrlListBox_GetText($Trefferliste_ID,$selection))
    $zeile = FileReadLine($fileID)
    If @error Then ExitLoop
    If _BegriffeSuchen($begriffe,$zeile) = $begriffe[0] Then GUICtrlSetData($Anzeigeliste_ID,$zeile)
    Wend
    FileClose($fileID)
    ;_GUICtrlListBox_SetCurSel($Anzeigeliste_ID,-1)
    EndFunc

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
    If Not IsHWnd($Trefferliste_ID) Then $hWndListBox = GUICtrlGetHandle($Trefferliste_ID)
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Switch $hWndFrom
    Case $Trefferliste_ID, $hWndListBox
    Switch $iCode
    Case $LBN_DBLCLK
    ListDblClick()
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func _BegriffeSuchen ($aBegriffe, $sString)
    Local $gefunden = 0
    If not IsArray($aBegriffe) Then Return 0
    For $i = 1 To $aBegriffe[0]
    If StringInStr($sString,$aBegriffe[$i]) > 0 Then $gefunden += 1
    Next
    Return $gefunden
    EndFunc ; _BegriffeSuchen

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Es hängt am Auslesen und Umbennen der Dateien in die Aktuelle Zeit & Datum und das gefundene Suchwort. Und bei dem von "Micha he" geposteten Script muss ich erst alles in Ruhe anschauen weil da so viele Variablen sind und ich den Zusammenhang finden will 8|
    z.B soll eine Datei am Ende heißen : 27.02.2009 & 20:35:55 & Beispiel.txt

  • In meinem Script steht in der Variable "$aktuelleDatei" in Zeile 73, der Dateiname der Textdatei, wenn alle Begriffe gefunden wurden.

    Du brauchst also eigentlich nur ein FileMove in die Zeile 73 schreiben. Nur Dein Namenschema taug schonmal nicht ! Doppelpunkt (in der Uhrzeit) gehen nicht in einem Datei oder Verzeichnisnamen. Ich empfehle "JJJJ_MM_TT_hh_mm_ss_[Suchbegriff].xxx"

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (27. Februar 2009 um 22:22)

  • Hallo Fanboi!

    hier ganz einfach programmiert, ohne jeden Schnickschnack,
    teste das mal durch:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; test_70.au3 für fanboi
    ; von msp-holzwurm
    ; mal ganze einfach anfangen

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

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

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

    $datelong = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC ; das ist mal ein vernünftiges Datumsformat

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

    $Version="1.00"
    $Vinfo="test_70 für Fanboi " & $Version
    ; hiermit kann man schön suchen!!

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

    ; Umgebung festlegen
    $SearchDir="f:\x99" ; =Verzeichnis dasz zu durchsuchen ist
    $SearchFiles="*.txt" ; dateityp festlegen

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

    ; Benutzer nach Suchbegriff fragen:
    $Suchbegriff= InputBox($VINFO, "Suchbegriff eingeben.", "")

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

    if StringLen($Suchbegriff) < 1 then
    msgbox(64,$VINFO, "kein Suchgberiff eingeben" & @CR & "ABBRUCH",10)
    exit
    EndIf

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

    $FolderList=_FileListToArray($SearchDir & "\", $Searchfiles,1) ; Flag 2 = nur Ordner
    If (Not IsArray($FolderList)) then
    msgbox(0,$VINFO, "keine Dateien im Suchordner gefunden",10)
    ELSE

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

    For $i = 1 To $FolderList[0]
    ; jetzt kommt eine Datei nach der anderen
    msgbox(0,$VINFO, "prüfe Datei: " & $SearchDir & "\" & $Folderlist[$i],1)

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

    $check01=_SearchinFile($SearchDir & "\" & $Folderlist[$i],$Suchbegriff)
    ; bei Antwort 0 nichts weiter tun
    ; bei Antwort 1 Datei umbenennen

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

    if $check01=1 then
    ; Variable neu setzen, auf aktuelle Zeit
    $datelong=@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC ; das ist mal ein vernünftiges Datumsformat
    FileMove($SearchDir & "\" & $Folderlist[$i], $SearchDir & "\" & $Folderlist[$i] & $Suchbegriff & "_" & $datelong)

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

    EndIf

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

    Next
    Endif

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

    Func _SearchinFile($File,$Suchbegriff)
    ; Funktion zum Testen, ob der Suchgebegriff enthalten ist
    ; Return 0=nicht gefunden
    ; Return 1=Treffer (beim ersten Treffer, wird nicht weitergesucht)

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

    Dim $myarray
    If Not _FileReadToArray($file,$myarray) Then
    MsgBox(4096,"FEHLER", " Datei " & $textdatei & " nicht gefunden, oder leer")
    Return 0
    EndIf

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

    For $x = 1 to Ubound($myarray) -1 ; jetzt wird das array von Zeile 1 bis zur lezten Zeile eingelesen
    $Zeile=$myArray[$x]
    ; msgbox(0,"ich hab jetzt die Zeile mit folgendem Inhalt:", $zeile)
    if StringInStr($zeile,$Suchbegriff) > 0 then ; Achtung irgenwo in der Zeile gefunden, die Antwort ist die Position
    msgbox(0,$VINFO, "hier hab ich den Suchbegriff drin: " & $zeile)
    Return 1
    EndIf

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

    Next

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

    EndFunc

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

    Danke langt nicht, so ein Kaffee wär schon angebracht!!!