Liste von Ordnerinhalt erzeugen

  • Hallo zusammen,

    ich habe folgendes Problem.
    In einem Ordner habe ich eine Menge .mp3 Dateien.

    Davon möchte ich nun eine Liste zum ausdrucken generieren.
    z.B. quer 4 Spalten.

    Also:
    1. Ich habe den Inhalt per Array eingelesen. (Klappt)
    2. Ich möchte den Inhalt m. regex bearbeiten (Und das klappt schon nicht) z.B. Lied.mp3 soll einfach Lied heißen.
    3. Wie kann ich das ganze in 4 Spalten fortlaufend nummeriert bekommen. (neue Spalte, nächstes Blatt)

    Hier mein Code

    Spoiler anzeigen
    [autoit]


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

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

    Dim $Ordnerwahl, $ListeNeu

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

    ; Ordner wird ausgewählt
    $Ordnerwahl = FileSelectFolder("Bitte Ordner wählen...", "")

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

    $Ordnerliste = _FileListToArray($Ordnerwahl, "*.mp3")
    _ArrayDisplay($Ordnerliste)

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

    ;Liste wird bearbeitet: z.B. alle suffix entfernen...

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

    $ListeNeu = StringRegExpReplace($Ordnerliste, '.mp3', '', 3)
    _ArrayDisplay($ListeNeu)

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

    ; Die neue Liste wird als TXT Abgespeichert.
    $file = FileOpen("test.txt", 1)

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

    ; Prüfen, ob Datei im Schreibmodus geöffnet ist
    If $file = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf

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

    For $i = 1 To UBound($ListeNeu) - 1

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

    If IsArray($ListeNeu) Then
    ;_ArrayDisplay($array)

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

    FileWriteLine($file, $ListeNeu & @CRLF)

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

    EndIf

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

    Next

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

    FileClose($file)
    MsgBox(4096, "Die Liste wurde generiert", "fertig", 1)

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


    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (10. November 2012 um 11:59)

  • du benutzt $ListeNeu = StringRegExpReplace($Ordnerliste, '.mp3', '', 3) für das ganze Array !!

    das geht nicht ..

    du must das durch ne schleife jagen

    z.b.

    [autoit]


    for $i=1 to $Ordnerliste[0]
    $ListeNeu[$i] = StringRegExpReplace($Ordnerliste[$i], '.mp3', '', 3)
    next

    [/autoit]
  • du benutzt $ListeNeu = StringRegExpReplace($Ordnerliste, '.mp3', '', 3) für das ganze Array !!

    das geht nicht ..

    du must das durch ne schleife jagen

    z.b.

    [autoit]


    for $i=1 to $Ordnerliste[0]
    $ListeNeu[$i] = StringRegExpReplace($Ordnerliste[$i], '.mp3', '', 3)
    next

    [/autoit]

    Das wird aber auch nicht funktionieren, da RegEx da nichts findet ;)
    Aber um die letzten 4 Zeichen zu ersetzen reicht auch ein einfaches StringReplace

    [autoit]

    ; Ordner wird ausgewählt
    $Ordnerwahl = FileSelectFolder("Bitte Ordner wählen...", "")
    $Ordnerliste = _FileListToArray($Ordnerwahl, "*.mp3")
    _ArrayDisplay($Ordnerliste)
    ;Liste wird bearbeitet: z.B. alle suffix entfernen...
    For $I = 1 To $Ordnerliste[0]
    $Ordnerliste[$i] = StringReplace($Ordnerliste[$i], '.mp3', '')
    Next
    _ArrayDisplay($Ordnerliste)

    [/autoit]

    Zu den 4 Spalten, wieviele Dateien sollen untereinander stehen? Du musst ja irgendwann sagen, so Stop, jetzt in die nächste Spalte

  • Hallo,

    merci für die Hilfe.
    Deine Frage:
    Wieviel Dateien sollen untereinander stehen...

    hm, wäre gut wenn man das von der Schriftgröße u. Spaltenanzahl abhängig macht.
    Am besten das Blatt ist voll, und man kann es gut lesen

    Liebe Grüße
    Ilse ;)

    EDIT:

    Mit StringReplace das geht.
    Wie mache ich das mit RegEX?? Da sind noch andere Zeichen drin Zahlen, (-...ware besser!

    Einmal editiert, zuletzt von Ilse (6. November 2012 um 16:02)

  • Du willst die Daten in eine Textdatei schreiben, da gibts keine Schriftgröße ^^
    Und auf was für ein Blatt soll es passen? Es gibt keine Seitenzahl bei einer txt Datei.

    RegEx ist eine tolle Sache,
    aber wenn du nur die Extension weghaben willst, ist dass das einfachste, da . in Dateinamen verboten ist.

  • Hallo,

    ...gut, wenn es keine Schriftgröße gibt, ich glaube 15-20 Einträge je Spalte.
    DIN-A4 Quer...

    Versteh nur nicht, warum regex gar nichts zeigt.
    Die Einträge sehen z.B. so aus

    Zitat

    1960 - 16 - Elvis - It's now or never.mp3
    Eis am Stil - Volare.mp3

    [autoit]


    For $I = 1 To $Ordnerliste[0]
    ;MsgBox(0,"",$Ordnerliste[$i])
    $Ordnerliste[$i] = StringRegExp($Ordnerliste[$i],'-\s(.*?)\.mp3',3)

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

    FileWriteLine($file, $Ordnerliste[$i] & @CRLF)
    Next

    [/autoit]

    d.h. in der Liste werden nur die Titel gebraucht.

    ;) Ilse

    Einmal editiert, zuletzt von Ilse (6. November 2012 um 17:18)

  • Hallo,

    geht leider auch nicht!

    Beispiel:
    Das ist v. _arraydisplay kopiert

    hier mal noch ein Screenshot v. Arraydisplay
    autoit.de/wcf/attachment/16519/

    mit regex kommt nichts an!

    ;) Ilse

  • StringRegExp gibt ein Array zurrück. :)
    Mach das ganze mal so:

    [autoit]


    For $I = 1 To $Ordnerliste[0]
    ;MsgBox(0,"",$Ordnerliste[$i])
    $aTempArray = StringRegExp($Ordnerliste[$i],'-\s(.*?)\.mp3',3)
    $Ordnerliste[$i] = $aTempArray[0]

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

    FileWriteLine($file, $Ordnerliste[$i] & @CRLF)
    Next

    [/autoit]

    lg chess

  • Hallo Chesstiger,

    konnte mich gestern leider nicht mehr melden.

    Das klappt leider auch nicht.
    Ich erhalte folgende Fehlermeldung:

    Zitat

    Subscript used with non-Array variable.:
    $Ordnerliste[$i] = $aTempArray[0]
    $Ordnerliste[$i] = $aTempArray^ ERROR

    hier nochmal das bisherge Script

    Spoiler anzeigen
    [autoit]


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

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

    Dim $Ordnerwahl, $ListeNeu, $aTempArray
    $file = FileOpen("test.txt", 1)
    ; Ordner wird ausgewählt
    $Ordnerwahl = FileSelectFolder("Bitte Ordner wählen...", "")

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

    $Ordnerliste = _FileListToArray($Ordnerwahl, "*.mp3")
    _ArrayDisplay($Ordnerliste)

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

    ;Liste wird bearbeitet: z.B. alle suffix entfernen...

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

    $ListeNeu = StringRegExpReplace($Ordnerliste, '.mp3', '', 3)
    _ArrayDisplay($ListeNeu,"Original-Dateien")

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

    ; Die neue Liste wird als TXT Abgespeichert.

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

    ; Prüfen, ob Datei im Schreibmodus geöffnet ist
    If $file = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf

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

    For $I = 1 To $Ordnerliste[0]
    ;MsgBox(0,"",$Ordnerliste[$i])
    $aTempArray = StringRegExp($Ordnerliste[$i],'-\s(.*?)\.mp3',3)
    $Ordnerliste[$i] = $aTempArray[0]

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

    FileWriteLine($file, $Ordnerliste[$i] & @CRLF)
    Next

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

    FileClose($file)
    MsgBox(4096, "Die Liste wurde generiert", "fertig", 1)

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

    EDIT:
    Wenn ich z.B. alles in die Zwischenablage kopiere,
    dann klappt dieser Code

    [autoit]


    Global $sSource
    $ssource = Clipget()
    MsgBox(0,"",$sSource)

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

    $arrayfilter = StringRegExp($sSource,'(?:\D+\s)(?:\-)(?:\s|)(.*?)(?:\.mp3)',3)
    _ArrayDisplay($arrayfilter, "Bezeichner")

    [/autoit]

    nur im Script läuft das alles nicht

    Liebe Grüße

    Ilse ;)

    Einmal editiert, zuletzt von Ilse (7. November 2012 um 10:09)

  • ich kann zwar nix zu deinem RegEX mithelfen .. hab da aber ne UHRALTE SUCHFUNKTION bei mir im archiv gefunden ..

    versuch die doch mal ..

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version:
    Author: Vivus

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

    Script Function:
    Sucht eine Datei, bezieht dabei alle Unterordner mit ein.
    Es wird der native-pfad der ersten Datei zurückgeliefert.

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

    #ce ----------------------------------------------------------------------------

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

    Global $_searchSilent = 0

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

    Func _searchFileInSUBDirectorys($startpath, $Filename)
    If $_searchSilent = 1 then ConsoleWrite("_searchFileInSUBDirectorys von " & $startpath & " nach " & $Filename & @CRLF)
    $filePath = _searchFileInDirectory($startpath, $Filename)
    ;ConsoleWrite("-S->"&$filePath& @CRLF)
    If $filePath = False Then
    ; einen ordner tiefer
    $A_return = _getArrayOfDirectorys($startpath)
    ;_ArrayDisplay($A_return, "$A_return in _searchFileInSUBDirectorys ")
    If $A_return[0] > 0 Then
    ; subfolder vorhanden
    ;MsgBox(0, "alter_pfad _searchFileInSUBDirectorys", $startpath)
    For $i = 1 To $A_return[0]
    ;ConsoleWrite("_getArrayOfDirectorys max = "&$A_return[0] & " momentan " & $A_return[$i] & @CRLF)
    $path_and_sub_folder = $startpath& "\" &$A_return[$i]

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

    ; jetzt die recursion !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    $recursion_value = _searchFileInSUBDirectorys($path_and_sub_folder, $Filename)

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

    If $recursion_value = False Then
    ;such weiter
    Else
    Return $recursion_value
    EndIf
    Next
    Else
    ; kein sub folder
    ;MsgBox(0, "kein sub folder -> _searchFileInSUBDirectorys", "kein sub folder in " & $search_Place)
    EndIf
    EndIf

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

    If $_searchSilent = 1 then ConsoleWrite("Result = " & $filePath & @CRLF)
    Return $filePath
    EndFunc ;==>_searchFileInSUBDirectorys

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

    Func _getArrayOfDirectorys($path)
    Dim $A_return[1]
    ;_ArrayDisplay($A_return, "$A_return")
    Local $Folder_array = _FileListToArray($path, "*", 2)
    If @error > 0 Then
    ;MsgBox(0, "", "No Folders Found.")
    $A_return[0] = 0
    Return $A_return
    EndIf
    Return $Folder_array
    EndFunc ;==>_getArrayOfDirectorys

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

    Func _searchFileInDirectory($path, $Filename)
    $retval = FileExists($path & "\" & $Filename)
    ;ConsoleWrite("_searchFileInDirectory "&$path & " nach " & $Filename & "Retval = " &$retval &@CRLF)
    If $retval = 1 Then
    Return $path & "\" & $Filename
    Else
    Return False
    EndIf
    EndFunc ;==>_searchFileInDirectory

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _FileListToArray
    ; Description ...: Lists files and\or folders in a specified path (Similar to using Dir with the /B Switch)
    ; Syntax.........: _FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]])
    ; Parameters ....: $sPath - Path to generate filelist for.
    ; $sFilter - Optional the filter to use, default is *. Search the Autoit3 helpfile for the word "WildCards" For details.
    ; $iFlag - Optional: specifies whether to return files folders or both
    ; |$iFlag=0(Default) Return both files and folders
    ; |$iFlag=1 Return files only
    ; |$iFlag=2 Return Folders only
    ; Return values .: @Error - 1 = Path not found or invalid
    ; |2 = Invalid $sFilter
    ; |3 = Invalid $iFlag
    ; |4 = No File(s) Found
    ; Author ........: SolidSnake <MetalGX91 at GMail dot com>
    ; Modified.......:
    ; Remarks .......: The array returned is one-dimensional and is made up as follows:
    ; $array[0] = Number of Files\Folders returned
    ; $array[1] = 1st File\Folder
    ; $array[2] = 2nd File\Folder
    ; $array[3] = 3rd File\Folder
    ; $array[n] = nth File\Folder
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; Note ..........: Special Thanks to Helge and Layer for help with the $iFlag update speed optimization by code65536, pdaughe
    ; ===============================================================================================================================
    Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
    Local $hSearch, $sFile, $sFileList, $sDelim = "|"
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
    $hSearch = FileFindFirstFile($sPath & $sFilter)
    If @error Then Return SetError(4, 4, "")
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If ($iFlag + @extended = 2) Then ContinueLoop
    $sFileList &= $sDelim & $sFile
    WEnd
    FileClose($hSearch)
    If Not $sFileList Then Return SetError(4, 4, "")
    Return StringSplit(StringTrimLeft($sFileList, 1), "|")
    EndFunc ;==>_FileListToArray

    [/autoit]
  • Ilse Dann Fehlerabfrage:

    [autoit]


    For $I = 1 To $Ordnerliste[0]
    ;MsgBox(0,"",$Ordnerliste[$i])
    $aTempArray = StringRegExp($Ordnerliste[$i],'-\s(.*?)\.mp3',3)
    If IsArray($aTempArray) Then $Ordnerliste[$i] = $aTempArray[0]

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

    FileWriteLine($file, $Ordnerliste[$i] & @CRLF)
    Next

    [/autoit]

    lg chess

  • So funktioniert es, kannst es ja mal ausprobieren.
    Sollte es Lieder geben, die nicht durch das RegEx kommen, kannst du die ja hier posten oder per PN an mich, dann pass ich das Regex an

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Local $array[1]

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

    _ArrayAdd($array, "(Eis Am Stiel) Dalida - Come Prima.mp3")
    _ArrayAdd($array, "01 - Boney M - Rivers Of Babylon.mp3")
    _ArrayAdd($array, "01 - Danyel Gerard - Butterfly.mp3")
    _ArrayAdd($array, "01 - Demis Roussos - Good Bye My Love Good Bye.mp3")
    _ArrayAdd($array, "01 - George Baker Selection - Una Paloma Blanca.mp3")
    _ArrayAdd($array, "01 - Pussycat - Mississippi.mp3")
    _ArrayAdd($array, "01 - Simon & Garfunkel - El Condor Pasa.mp3")

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

    For $I = 1 To UBound($array) -1
    ;MsgBox(0,"",$Ordnerliste[$i])
    $test = StringRegExp($array[$i],'(?:.*)(?:\-)(?:\s|)(.*?)(?:\.mp3)', 3)
    If not IsArray($test) Then
    ConsoleWrite('REGEX passt nicht für ' & $array[$i] & @crlf )
    Else
    $Titel = $test[0]
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Titel = ' & $Titel & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    EndIf
    Next

    [/autoit]