Array: Doppelte Werte löschen & Loop beim Schreiben einer Datei

  • Nabend

    Ich habe gerade 2 Probleme bei meinem Script. Das eine äussert sich darin dass ich ein Array habe, bei welchem unter Umständen 2 mal der Gleiche Eintrag vorkommen kann. Kann man ein Array irgendwie nach Doppelten durchsuchen um diese dann rauszulöschen? Nebenbei habe ich das Problem dass er irgendwo beim Schreiben der Liste hängen bleibt und immer das gleiche schreibt, anstatt weiterzufahren. Hiermal das Script:

    [autoit]

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

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

    ;Alte Liste löschen
    FileDelete("Liste.txt")

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

    ;Ordner erstellen falls keine Unterordner vorhanden sein sollten
    DirCreate("E:\Benutzer\Ahatius\Eigene Videos\Movies\zz")
    DirCreate("F:\Benutzer\Ahatius\Eigene Videos\Serien\zz")
    DirCreate("F:\Benutzer\Ahatius\Programme\Games\zz")
    DirCreate("F:\Benutzer\Ahatius\Programme\Applikationen\zz")

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

    ;Neue Listendatei erstellen
    $Liste = FileOpen("Liste.txt", 1)

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

    ;Daten zusammentragen
    $Movies = _FileListToArray("E:\Benutzer\Ahatius\Eigene Videos\Movies", "*", 2)
    $Movies2 = _FileListToArray("F:\Benutzer\Ahatius\Eigene Videos\Movies", "*", 2)
    $Serien = _FileListToArray("E:\Benutzer\Ahatius\Eigene Videos\Serien", "*", 2)
    $Serien2 = _FileListToArray("F:\Benutzer\Ahatius\Eigene Videos\Serien", "*", 2)
    $Games = _FileListToArray("E:\Benutzer\Ahatius\Programme\Games", "*", 2)
    $Games2 = _FileListToArray("F:\Benutzer\Ahatius\Programme\Games", "*", 2)
    $Applikationen = _FileListToArray("E:\Benutzer\Ahatius\Programme\Applikationen", "*", 2)
    $Applikationen2 = _FileListToArray("F:\Benutzer\Ahatius\Programme\Applikationen", "*", 2)

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

    ;Erstes Array rauslöschen
    _ArrayDelete($Movies, 0)
    _ArrayDelete($Movies2, 0)
    _ArrayDelete($Serien, 0)
    _ArrayDelete($Serien2, 0)
    _ArrayDelete($Games, 0)
    _ArrayDelete($Games2, 0)
    _ArrayDelete($Applikationen, 0)
    _ArrayDelete($Applikationen2, 0)

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

    ;Arrays zusammenfügen
    _ArrayConcatenate($Movies, $Movies2)
    _ArrayConcatenate($Serien, $Serien2) ;Ab diesem Zeitpunkt enthält das Array $Serien doppelte Einträge
    _ArrayConcatenate($Games, $Games2)
    _ArrayConcatenate($Applikationen, $Applikationen2)

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

    ;Arrays sortieren
    _ArraySort($Movies)
    _ArraySort($Serien)
    _ArraySort($Games)
    _ArraySort($Applikationen)

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

    ;Anzahl der Ordner definieren
    $AnzahlMovies = UBound($Movies) -2
    $AnzahlSerien = UBound($Serien) -2
    $AnzahlGames = UBound($Games) -2
    $AnzahlApplikationen = UBound($Applikationen) -2

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

    ;Filme schreiben
    FileWrite($Liste, "<b><font size=4><u>Filme</u></b></font><br/><br/>")
    For $i = 0 to $AnzahlMovies
    FileWrite($Liste, $Movies[$i] & "<br/>")
    Next
    FileWrite($Liste, "-----<br/>Anzahl Filme: " & $AnzahlMovies & "<br/><br/><b><font size=4>==============================</font></b><br/><br/>")

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

    ;Serien schreiben
    FileWrite($Liste, "<b><font size=4><u>Serien</u></b></font><br/><br/>")
    For $i = 0 to $AnzahlSerien
    FileWrite($Liste, $Serien[$i] & "<br/>")
    $CheckStaffeln = 1
    $CheckStaffeln2 = 1
    $Staffeln = _FileListToArray("E:\Benutzer\Ahatius\Eigene Videos\Serien\" & $Serien[$i], "*", 2)
    If @error then $CheckStaffeln = 0 ;Wird auf 0 gesetzt falls der Ordner unter diesem Pfad nicht existiert

    $Staffeln2 = _FileListToArray("F:\Benutzer\Ahatius\Eigene Videos\Serien\" & $Serien[$i], "*", 2)
    If @error then $CheckStaffeln2 = 0 ;Wird auf 0 gesetzt falls der Ordner unter diesem Pfad nicht existiert

    If $CheckStaffeln = 1 And $CheckStaffeln2 = 1 Then ;Dieses Szenario tritt genau einmal auf, allerdings hat er bei diesem Szenario kein Problem
    _ArrayDelete($Staffeln, 0)
    _ArrayDelete($Staffeln2, 0)
    _ArrayConcatenate($Staffeln, $Staffeln2)
    _ArraySort($Staffeln)
    $AnzahlStaffeln = UBound($Staffeln) - 1
    For $i = 0 to $AnzahlStaffeln
    FileWrite($Liste, $Staffeln[$i] & "<br/>")
    Next

    ElseIf $CheckStaffeln = 1 And $Checkstaffeln2 = 0 Then ;Dieses Szenario trifft in 99% aller Fälle ein. Bei den ersten Paar Ordner die er schreibt klappts. Allerdings hängt er sich bei immer dem gleichen Ordner auf
    _ArrayDelete($Staffeln, 0)
    _ArraySort($Staffeln)
    $AnzahlStaffeln = UBound($Staffeln) - 1
    For $i = 0 to $AnzahlStaffeln
    FileWrite($Liste, $Staffeln[$i] & "<br/>")
    Next

    ElseIf $CheckStaffeln = 0 And $CheckStaffeln2 = 1 Then ;Dieses Szenario existiert noch nicht, daher auch noch nicht getestet
    _ArrayDelete($Staffeln2, 0)
    _ArraySort($Staffeln2)
    $AnzahlStaffeln = Ubound($Staffeln2) - 1
    For $i = 0 to $AnzahlStaffeln
    FileWrite($Liste, $Staffeln2[$i] & "<br/>")
    Next
    EndIf
    Next

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

    ;Games schreiben
    FileWrite($Liste, "<b><font size=4><u>Games</u></b></font><br/><br/>")
    For $i = 0 to $AnzahlGames
    FileWrite($Liste, $Games[$i] & "<br/>")
    Next
    FileWrite($Liste, "-----<br/>Anzahl Games: " & $AnzahlGames & "<br/><br/><b><font size=4>==============================</font></b><br/><br/>")

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

    ;Applikationen schreiben
    FileWrite($Liste, "<b><font size=4><u>Applikationen</u></b></font><br/><br/>")
    For $i = 0 to $AnzahlApplikationen
    FileWrite($Liste, $Applikationen[$i] & "<br/>")
    Next
    FileWrite($Liste, "-------------<br/>Anzahl Applikationen: " & $AnzahlApplikationen & "<br/><br/><b><font size=4>==============================</font></b><br/><br/>")

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

    ;Zeitstempel
    FileWrite($Liste, "Generiert am " & @MDAY & "." & @MON & "." & @YEAR & " um " & @HOUR & ":" & @MIN & ":" & @SEC & " Uhr.<br/><br/>")

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

    ;Erstellte Ordner löschen
    DirRemove("E:\Benutzer\Ahatius\Eigene Videos\Movies\zz")
    DirRemove("E:\Benutzer\Ahatius\Eigene Videos\Serien\zz")
    DirRemove("F:\Benutzer\Ahatius\Programme\Games\zz")
    DirRemove("F:\Benutzer\Ahatius\Programme\Applikationen\zz")

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

    ;Zugriff auf Datei schliessen
    FileClose($Liste)

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

    ;Upload der Liste
    $server = "host"
    $username = "user"
    $pass = _StringEncrypt(0, "12345", "12345")
    $Open = _FTPOpen("Upload Liste")
    $Conn = _FTPConnect($Open, $server, $username, $pass, True)
    $Ftpp = _FtpPutFile($Conn, "Liste.txt", "Pfad/Liste.txt")

    [/autoit]

    4 Mal editiert, zuletzt von ahatius (27. Dezember 2009 um 23:22)

  • Danke, somit hat sich das erste Problem erledigt. Bleibt nur noch der Loop beim Schreiben der Datei.

  • Bei der For Schleife für Serien. Zuerst soll er den Namen der Serie schreiben (Oberordner). Daraufhin soll er die einzelnen Staffeln (Unterordner aufschreiben). Das macht er die ersten paar Male auch richtig, aber irgendwann beginnt er immer die gleiche Serie mit Staffeln zu posten. Also sieht zum Beispiel so aus:

    Code
    Scrubs<br/>Staffel 1<br/>Staffel 2<br/>Scrubs<br/>Staffel 1<br/>Staffel 2<br/>Scrubs<br/>Staffel 1<br/>Staffel 2<br/>Scrubs<br/>Staffel 1<br/>Staffel 2<br/>Scrubs<br/>Staffel 1<br/>Staffel 2<br/>Scrubs<br/>Staffel 1<br/>Staffel 2<br/>....


    Hab gedacht es sei immer beim gleichen Ordner, aber habe grade fest gestellt dass es immer wieder mal ein anderer Ordner ist.

    • Offizieller Beitrag

    Du Benutzt verschachtelte For Next Schleifen mit der Selben Variable $i. Du mußt unterschiedliche Variablen nehmen.

  • Mir ist gerade aufgefallen dass ArrayUnique wieder einen Index bei $Array[0] einfügt. Das habe ich allerdings mit den ArrayDelete's versucht zu umgehen. Gibt's da eine andere Möglichkeit? Habe den Parameter unter $iBase angeschaut, aber bringt keine Änderung so wie es aussieht.

    • Offizieller Beitrag

    Im Feld 0 steht die Anzahl der Elemente.

    Du kannst auch mit dem Feld 0 Arbeiten . For $i = 1 to $ArrayUnique[0].Damit Kannst du dir das ganze ArrayDelete und UBound gedönse sparen.

  • Im Feld 0 steht die Anzahl der Elemente.

    Du kannst auch mit dem Feld 0 Arbeiten . For $i = 1 to $ArrayUnique[0].Damit Kannst du dir das ganze ArrayDelete und UBound gedönse sparen.


    Hab ich mir auch gedacht, aber war ein wenig zu faul es umzuschreiben, und hab daher mal gehofft dass man dass irgendwie einstellen kann. :D

    Aber gut, ich machs dann so ;)

    Aber die ersten paar Arrays muss ich trotzdem rauslöschen, da ich sonst von den vorherigen Arrays den Index mitten im Array habe.

  • Ich kann das Array so doch nicht gebrauchen. Zum Beispiel gibt es Spiele oder Filme die mit einer Zahl anfangen. Wenn der Index also grösser als die Anfangszahl von einem Film oder einem Spiel ist, dann nimmt er nicht die Index Zahl, sondern die vom Film/Spiel. Daher bräuchte ich eigentlich doch eine Lösung welche Doppelte rausfischt, aber keinen Index erstellt.

    Edit: Mein Fehler. Wenn ich zuerst sortiere und dann ArrayUnique mache, klappts wunderbar.