txt zeile mit Endung rauswerfen

  • hi
    ich habe mir ein kleines tool gebaut mit dem ich ACL Berechtigungen pro Ordner inkl. unterordner pro Benutzername/Gruppe auswählen kann.

    die ausgabe erfolgt wie foglt

    [autoit]

    Local $output
    FileDelete("ACL.txt")
    Local $file = FileOpen("ACL.txt", 1)
    ConsoleWrite($MyCommand)
    While 1
    $output = StdoutRead($foo)
    If @error Then ExitLoop
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    FileWrite($file, $output)
    WEnd
    FileClose($file)

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

    ShellExecute('notepad.exe', "ACL.txt")

    [/autoit]

    Das klappt auch ganz gut. ich kann vor dem command wählen ob mit oder ohne unterordner.
    Die Ausgabe der TXT sieht dann wie folgt aus

    Zitat

    SID gefunden: C:\Users\username\Desktop\test\.
    SID gefunden: C:\Users\username\Desktop\test\hallo.txt
    SID gefunden: C:\Users\username\Desktop\test\Thumbs.db.
    SID gefunden: C:\Users\username\Desktop\Application\
    SID gefunden: C:\Users\username\Desktop\Application\test.txt
    5 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.

    Was mich jetzt interessieren würde ist folgendes.
    Ich möchte das in der TXT alle zeilen die eine Datei am Ende haben, entfernt werden.
    So das bei diesm Beispiel in der TXT dann nur noch das hier steht

    Zitat

    SID gefunden: C:\Users\username\Desktop\test\.
    SID gefunden: C:\Users\username\Desktop\Application\
    5 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.

    Sprich alle Zeilen die am ende eine .xls .exe oder sonstige dateiendung haben sollen komplett entfernt werden.
    Ich muss leider den umweg über die änderung über die TXT-Datei machen da ich mit dem ACL Tool nur Ornder oder ORdner inkl. Unterordner wählen kann aber nicht "nur ordner ohne Dateien"

    Ich könnte mir vorstellen das es wie folgt geht
    "Wenn in einer Zeile in der txt datei ein punkt . und noch 3 weitere zeichen kommen, dann lösch die zeile raus."

    Einmal editiert, zuletzt von cobain86 (17. März 2013 um 12:53)

  • ich hab was gefunden
    muss es nur noch anpassen das es für endungen .xxx. gilt(also beliebige)

    [autoit]


    Global $_Array
    _FileReadToArray ( 'ACL.txt', $_Array )
    $_Array = _DeleteArrayElementWithStringInstr ( $_Array, '.mp3.' )
    _FileWriteFromArray ( 'ACL.txt', $_Array, 1 )
    Func _DeleteArrayElementWithStringInstr ( $_Array, $_String )
    Local $_Item
    For $_Element In $_Array
    If StringInStr ( $_Element, $_String ) <> 0 Then
    _ArrayDelete ( $_Array, $_Item )
    Else
    $_Item+=1
    EndIf
    Next
    Return ( $_Array )
    EndFunc ;==> _DeleteArrayElementWithStringInstr ( )

    [/autoit]
  • Lies einfach jede Zeile der *.txt einzelnd ein, und überprüfe dann mit einem StringRegExp Pattern ob die Datei eine Dateiendung hat.
    Hatte schonmal sowas geschrieben. Ich suche es mal eben auf mein rechner bzw. Tippe es neu...

    Achja, speicher in einer Variable die Zeilennummer,... Kannst dann den Text ersetzen.


    €dit:
    Machs dir doch noch einfacher... Lies jede Zeile einzelnd aus und überprüfe ob sich ein Punkt " . " im String befindet. Wenn ja, hat es definitiv eine Dateiendung ^^
    Vorraussgesetzt der Aufbau bleibt so gleich...

    Einmal editiert, zuletzt von Yjuq (16. März 2013 um 13:34)

  • Lies einfach jede Zeile der *.txt einzelnd ein, und überprüfe dann mit einem StringRegExp Pattern ob die Datei eine Dateiendung hat.
    Hatte schonmal sowas geschrieben. Ich suche es mal eben auf mein rechner bzw. Tippe es neu...

    Achja, speicher in einer Variable die Zeilennummer,... Kannst dann den Text ersetzen.


    €dit:
    Machs dir doch noch einfacher... Lies jede Zeile einzelnd aus und überprüfe ob sich ein Punkt " . " im String befindet. Wenn ja, hat es definitiv eine Dateiendung ^^
    Vorraussgesetzt der Aufbau bleibt so gleich...


    no das geht nicht
    da auch die einzelnen ordner nach dem \ einen punkt haben!
    aber ich könnte es so machen das alle zeilen die auf \. enden bestehen bleiben und der rest gelöscht wird.

  • dann würde aber diese Zeile

    Code
    5 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.


    gelöscht werden, was du aber oben nicht erwähnst.

    hab da mal schnell was geschrieben, sollte so stimmen

    Spoiler anzeigen
    [autoit]

    Global $sNewText, $sLine
    Global $hFile = FileOpen("Text.txt",2) ;Richtigen Dateinamen einsetzen
    While 1
    $sLine = FileReadLine($hFile) ; Zeile für Zeile auslesen
    if @error = -1 Then ExitLoop ; Bei Dateiende Schleife verlassen
    if Not StringRegExp($sLine,'^.+\.[^\\/:*?"<>| ]+$') Then $sNewText &= $sLine & @CRLF ; Wenn keine Dateiendung wieder zum Schreiben eintragen
    WEnd
    $sNewText = StringTrimRight($sNewText,2) ; Den letzten Zeilenumbruch entfernen
    FileWrite($hFile,$sNewText) ; Neuen Text in Datei schreiben
    FileClose($hFile) ; Datei wieder schließen

    [/autoit]

    3 Mal editiert, zuletzt von Alcros (16. März 2013 um 14:25)

  • Weil der Punkt sich doch nur am Ende der Zeile befindet, kannst du ihn einfach abschneiden.
    Dateiendungen haben mindestens 1 Buchstabe...
    Daher kannst du das ohne bedenken machen ^^

    €dit:
    Eine weitere Möglichkeit wäre zu überprüfen wäre, ob das letzte Zeichen ein "\" ist oder die letzten beiden Zeichen ein "\." ist...
    Kannst dir ja jetzt was aussuchen.

    Spoiler anzeigen
    [autoit]

    ; AutoIt Version: 3.3.9.4 (beta)
    ; Author: Make-Grafik

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <File.au3>

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

    Opt('MustDeclareVars', 1)
    Global $sDatei, $hOpen, $avRead, $iCounter

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $sDatei = 'SID gefunden: C:\Users\username\Desktop\test\.' & @CRLF & _
    'SID gefunden: C:\Users\username\Desktop\test\hallo.txt' & @CRLF & _
    'SID gefunden: C:\Users\username\Desktop\test\Thumbs.db.' & @CRLF & _
    'SID gefunden: C:\Users\username\Desktop\Application\' & @CRLF & _
    'SID gefunden: C:\Users\username\Desktop\Application\test.txt' & @CRLF & _
    '5 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.'

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

    $hOpen = FileOpen('ACL-Sample.txt', 2)
    FileWrite($hOpen, $sDatei)
    FileClose($hOpen)

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

    ConsoleWrite(@CRLF & '! Vorher:' & @CRLF & FileRead('ACL-Sample.txt') & @CRLF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ;~ _FileReadToArray('ACL-Sample.txt', $avRead)
    ;~ $hOpen = FileOpen('ACL-Sample.txt', 2)

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

    ;~ For $iCounter = 1 To $avRead[0] - 1
    ;~ If Not StringInStr($avRead[$iCounter], '.', 0, 1, 1, StringLen($avRead[$iCounter]) - 1) Then FileWrite($hOpen, $avRead[$iCounter] & @CRLF)
    ;~ Next

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

    ;~ FileWrite($hOpen, $avRead[$avRead[0]])
    ;~ FileClose($hOpen)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    _FileReadToArray('ACL-Sample.txt', $avRead)
    $hOpen = FileOpen('ACL-Sample.txt', 2)

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

    For $iCounter = 1 To $avRead[0] - 1
    If StringTrimLeft($avRead[$iCounter], StringLen($avRead[$iCounter]) - 1) = '\' Or _
    StringTrimLeft($avRead[$iCounter], StringLen($avRead[$iCounter]) - 2) = '\.' Then
    FileWrite($hOpen, $avRead[$iCounter] & @CRLF)
    EndIf
    Next

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

    FileWrite($hOpen, $avRead[$avRead[0]])
    FileClose($hOpen)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ConsoleWrite(@CRLF & '! Nachher:' & @CRLF & FileRead('ACL-Sample.txt') & @CRLF & @CRLF)

    [/autoit]

    5 Mal editiert, zuletzt von Yjuq (16. März 2013 um 15:04)

  • Ich würde es so lösen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>

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

    Global $aArray
    _FileReadToArray('ACL.txt', $aArray)
    _ArrayDisplay($aArray, 'vorher')
    $aArray = _DeleteArrayElementWithFileExtatEnd($aArray, '.mp3.')
    _ArrayDisplay($aArray, 'nachher')
    _FileWriteFromArray('ACL_New.txt', $aArray, 1)
    Func _DeleteArrayElementWithFileExtatEnd($aArray, $_String)
    Local $iItems, $aSplit
    For $iItems = UBound($aArray) - 1 To 1 Step -1
    $sElement = StringReplace($aArray[$iItems] & '.', '..', '.') ;damit jede Zeile ein Punkt am Ende hat
    $aSplit = StringSplit($sElement, '\')
    StringReplace($aSplit[$aSplit[0]], '.', '')
    If @extended > 1 Then _ArrayDelete($aArray, $iItems)
    Next
    $aArray[0]=UBound($aArray) - 1
    Return ($aArray)
    EndFunc ;==>_DeleteArrayElementWithFileExtatEnd

    [/autoit]

    mfg autoBert

  • Und du hast autoBert's Script nicht kapiert...
    Die Variable (bzw. Parameter) $_String wird gar nicht verwendet...
    Hast du das Script überhaupt mal ausgeführt?

    Bitte erst den Code verstehen bevor man sich darüber beschwert!

  • Die Variable (bzw. Parameter) $_String wird gar nicht verwendet...

    ist leider durch C&P passiert, deshalb jetzt das aufgeräumte Skript zusätlich etwas kommentiert:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>

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

    Global $aArray
    _FileReadToArray('ACL.txt', $aArray)
    If IsArray($aArray) Then
    _ArrayDisplay($aArray, 'vorher')
    $aArray = _DeleteArrayElementWithFileExtatEnd($aArray)
    _ArrayDisplay($aArray, 'nachher')
    _FileWriteFromArray('ACL_New.txt', $aArray, 1)
    Else
    MsgBox(0, 'Fehler', 'Array micht vorhanden')
    EndIf

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

    Func _DeleteArrayElementWithFileExtatEnd($aArray)
    Local $iItems, $aSplit
    For $iItems = UBound($aArray) - 1 To 1 Step -1 ;von hinten anfsngen da durch jeden Löschvorgang sich ja das Array ändert
    $sElement = StringReplace($aArray[$iItems] & '.', '..', '.') ;sicherstellen das jede Zeile ein Punkt am Ende hat
    $aSplit = StringSplit($sElement, '\')
    StringReplace($aSplit[$aSplit[0]], '.', '')
    ConsoleWrite($aSplit[$aSplit[0]] & @TAB & @extended & @CRLF)
    If @extended > 1 Then _ArrayDelete($aArray, $iItems) ;da nur bei FileExt. ein 2. Punkt vorhanden löschen
    Next
    $aArray[0] = UBound($aArray) - 1
    Return ($aArray)
    EndFunc ;==>_DeleteArrayElementWithFileExtatEnd

    [/autoit]

    klappt! Danke
    jetzt muss ich den code nur noch verstehen


    Bitte, ist ganz einfach: das Skript beruht auf der Tatsache das eine Dateierweiterung einen Punkt enthält. Da aber manche nicht zu löschende Zeilen auch einen Punkt am Ende haben und manche zu löschende aber keinen sorge ich in Zeile 18 dafür daß jedes Arrayelement mit einem Punkt endet. In Zeile 19 splitte ich das Element auf um in Zeile 20 im letzten Splitteil alle Punkte zu ersetzen. Da Stringreplace in @exended freundlicherweise die Anzahl der Ersetzungen speichert lösche ich in Zeile 22 alle Arrayelemente bei denen mehr als 1 Ersetzung vorkam. Also alles keine Hexerei.

    mfg autoBert