Array - Probleme mit der Suche

  • Hallo,

    kann mich gar nicht mehr daran erinnern wann ich mich hier angemeldet habe, aber seit einiger Zeit bin ich wieder mit Autoit unterwegs und schlage mich so durch.

    Nun habe ich begonnen mich mit Array zu beschäftigen und mir auch die Hilfe und diverse Tutorials dazu angeschaut und ich denke mir auch recht gut verstanden.

    Folgendes Projekt habe ich mir derzeit vorgenommen:

    Ich habe sehr viele Serien, die sich im Lauf der Jahre angesammelt haben. Diese möchte ich nun vernünftig benamen und in Staffel Ordner sortieren, so dass ich diese vernünftigt mit XBMC nutzen kann.

    Fertige Lösungen kann ich dazu nicht finden, also dachte ich mir ich versuche es mal mit AutoIT.

    Als Grundlage habe ich z.B einen Ordner mit allen Folgen einer Serie.
    Des Weiteren ein Textfile mit dem folgendem Aufbau:
    Monk/1/1/Mr Monk und das Attentat Teil 1
    Monk/1/2/Ist in Episode 1 enthalten
    Monk/1/3/Mr Monk und die Hellseherin
    Monk/1/4/Mr Monk gegen die Qualle
    Monk/1/5/Mr Monk auf dem Rummelplatz
    Monk/1/6/Mr Monk in der Anstalt
    Monk/1/7/Mr Monk und ein Milliardaer auf Abwegen
    Monk/1/8/Mr Monk und Monica
    Monk/1/9/Mr Monk und der Marathon Mann
    Monk/1/10/Mr Monk macht Urlaub
    Monk/1/11/Mr Monk und das Erdbeben
    Monk/1/12/Mr Monk und Willie Nelson
    Monk/1/13/Mr Monk im Flugzeug
    Monk/2/1/Mr Monk geht wieder zur Schule
    Monk/2/2/Mr Monk faehrt nach Mexiko
    usw.

    Dieses Textfile lese ich in ein Array ein als Delimiter verwende ich "/" und mit ArrayDisplay bekomme ich folgendes Ergebnis

    Nun möchte ich das Array durchsuchen um die Dateien im Ordner der Festplatte umzubennen.
    Als Ergebnis möchte ich z.b den Namen der 12. Folge der ersten Staffel bekommen.
    "Mr Monk und Willie Nelson"

    Irgendwie verstehe ich die Suche aber nicht so recht.

    Hier mal der Part mit der Suche des Quelltextes

    [autoit]

    $aResult = _ArrayFindAll($aText,$Staffel,0,0,1,0,1)
    ; hier durchsuche ich das Array nach der Staffel
    _ArrayDisplay($aResult,"Ergebnis der Suche in $aText")
    ; hier durchsuche ich das Array nach der Folge 12
    $aResult2 = _ArrayFindAll($aResult,"12",0,0,1,0,2)
    _ArrayDisplay($aResult2,"Ergebnis der Suche in $aResult2")

    [/autoit]

    Das erste _ArrayDisplay liefert mir folgendes zurück:

    Das 2. dann

    Letzendlich bleiben von allen Folgen nur eine über, aber wie komme ich nun an den Namen der Folge und wie schreibe ich diese an in eine Stringvariable, so dass ich diese für das folgende Umbenennen der Datei nutzen kann.

    Müsste dazu ja ermitteln welche Zeile im ursprünglichen Array den Namen der gewünschten Folge beinhaltet und im Anschluss
    dann den Namen aus dem Feld auslesen oder?

    Hoffe ich habe mein Problem verständlich geschildert und ihr könnt mir in irgendeiner Form Tips geben.

    Vielen Dank bereits im Voraus.

  • Hier mal ein Beispiel wie du es lösen könntest:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    Local $aText[7][4] = [["Monk", "1", "1", "Mr Monk und das Attentat Teil 1"], _
    ["Monk", "1", "2", "Ist in Episode 1 enthalten"], _
    ["Monk", "1", "3", "Mr Monk und die Hellseherin"], _
    ["Monk", "1", "4", "Mr Monk gegen die Qualle"], _
    ["Monk", "1", "5", "Mr Monk auf dem Rummelplatz"], _
    ["Monk", "2", "1", "Mr Monk geht wieder zur Schule"], _
    ["Monk", "2", "2", "Mr Monk faehrt nach Mexiko"]]

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

    $Staffel = 1
    $Episode = 3

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

    $String = _GetEpisodeName($aText, $Staffel, $Episode)

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

    MsgBox(0, "", $String)

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

    Func _GetEpisodeName($aArray, $iStaffel, $iEpisode)
    For $i = 0 To UBound($aArray) - 1
    If $aArray[$i][1] = $iStaffel And $aArray[$i][2] = $iEpisode Then Return $aArray[$i][3]
    Next
    EndFunc ;==>_GetEpisodeName

    [/autoit]
  • Dann eher in diese Richtung:

    Spoiler anzeigen
    [autoit]


    $aResult = _ArrayFindAll($aText,$Staffel,1,1,1,0,1)
    ; hier durchsuche ich das Array nach der Staffel
    _ArrayDisplay($aResult,"Ergebnis der Suche in $aText")
    ; hier durchsuche ich das Array nach der Folge 12
    $aResult2 = _ArrayFindAll($aResult,"12",2,2,1,0,2)
    _ArrayDisplay($aResult2,"Ergebnis der Suche in $aResult2")

    [/autoit]


    Die blauen Bereiche sind in der Hilfe erklärt. Du mußt auch die richtige "Col" auswählen.
    Den Fehler habe ich auch am Anfang gemacht. ;)

    Mit dem ganzen Script hätte ich evtl besser helfen können. SO geht es aber sicherlich nicht
    nur mir.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Hi,
    dieses Beispiel zeigt wieder anschaulich, dass es nicht für alle programmiertechnischen Probleme die passende UDF gibt. :D

    Masterciw,
    du warst schon auf dem richtigen Dampfer, deine Suchen haben auch die richtigen Ergebnisse gefunden!
    Allerdings ist die Verknüpfung eher suboptimal.
    Du müßtest, um per _arrayfindall() richtig anwenden zu können, die gefundenen Ergebnisse im durchsuchten Array immer in ein neues Array kopieren und dieses dann wiederum durchsuchen.
    Dann würdest du letztendlich nur die Zeilen mit dem passenden Ergebnissen (Staffel & Folge) bekommen.
    Partial-Arraykopierereien sind aber mit den Standard-AutoItfunktionen nicht abgedeckt.

    Daher würde ich auch, wie bereits von blubbstar gezeigt, direkt das Array durchlaufen und die Ergebnisse filtern.

    Weiterhin stellt sich mir die Frage, ob du überhaupt Arrays brauchst um zum Ergebnis zu kommen. Wie müssen die Dateien aussehen, welche du für XBMC benötigst?

  • Weiterhin stellt sich mir die Frage, ob du überhaupt Arrays brauchst um zum Ergebnis zu kommen.


    Exakt.
    Eine Datenbank wäre hierfür deutlich flexibler.
    In AutoIt ist z.B. SqLite in Form der Sqlite-UDF bereits integriert.
    Einfach mal im Netz nach einem kleinen Tutorial suchen und an deinem Beispiel umsetzen.
    Datenbanken sind ein sehr mächtiges Werkzeug. Wenn man sich ein bisschen eingarbeitet hat und die Vorteile sieht fallen einem noch zig andere Anwendungsfälle für ein welche man früher anders gelöst hätte.
    Es lohnt sich einfach damit zu beschäftigen.

  • Hallo zusammen,

    erst einmal vielen Dank für die vielen Antworten und anschaulichen Beispiele. Bisher habe ich es noch nicht geschafft das Ganze umzusetzen.

    Auf dem ersten Blick sieht aber der Beitrag von Blubbstar wie für mich gemacht aus.
    Auch die Geschichte mit der ausgelagerten Funktion finde ich toll auch wenn ich mich momentan noch nicht so sicher im Umgang mit Funktionen bin.

    Auch an Alina recht herzlichen Dank. In der Tat tue ich mich recht schwer in der Bestimmung der korrekten Column im Array. Hoffe ich werde das bald begreifen und dann sicher einsetzten.
    Wie gesagt bin ich noch ganz am Anfang mitt Autoit. Habe in der Vergangenheit viel mit Batch, VBS und VBA gemacht, aber Autoit und dessen Einsatzmöglichkeiten haben mich schier umgehauen.
    Wenn man erst einmal das Potential von Autoit erfasst hat, scheint es kaum noch Beschränkungen der Möglichkeiten zu geben.

    Andy, danke auch für Deine Antwort. Die Dateien, die ich für XBMC benötige sind eigentlich recht einfach gestrickt.
    Wichtig ist dazu das der Serienordner einen aussagekräftigen Namen hat. z.B Monk.
    Dann sollten die Unterordner z.B Staffel 01 bzw Season 01 heißen.
    Die Dateien in den Unterordner heißen dann meist: S01E01.mp4.
    Um ein wenig mehr Übersicht zu haben, habe ich an mich aber den Anspruch diese z.B Monk-S01-E01-Mr Monk und das Attentat Teil 1.mp4 zu nennen um diese auch mal gezielt z.B an meiner WD Box abzuspielen, die nicht über Scrapper verfügt, die sich anhand der Dateinamen die Informationen aus dem Internet ziehen.

    Auch Danke für den Tip mit der SQL-Lite Datenbank Andy. War mir gar nicht bewußt das es so einfach sein kann eine Datenbank unter Autoit zu erstellen und mein Respekt gegenüber Autoit ist gerade ein wenig mehr
    gewachsen.

    Also Euch allen erst einmal vielen Dank. Werde nachher mal schauen ob ich das umgesetzt bekomme und Euch auf dem Laufendem halten.

  • Hi,
    also wenn ich das jetzt richtig verstehe, benötigst du für XBMC nur eine Ordnerstruktur mit den entsprechenden Dateinamen?

    Du hast eine Datei mit Inhalt
    Monk/1/4/Mr Monk gegen die Qualle
    Monk/1/5/Mr Monk auf dem Rummelplatz
    Monk/2/1/Mr Monk geht wieder zur Schule
    Monk/2/2/Mr Monk faehrt nach Mexiko
    Also Verzeichnis/Season/Episode/Name

    und benötigst
    -Verzeichnisname:Monk

    • -Unterverzeichnis: Season 1

      • -Datei: Monk-S01-E04-Mr Monk gegen die Qualle.mp4
        -Datei: Monk-S01-E05-Mr Monk auf dem Rummelplatz.mp4
    • -Unterverzeichnis: Season 2

      • -Datei: Monk-S02-E01-Mr Monk geht wieder zur Schule.mp4
        -Datei: Monk-S02-E02-Mr Monk faehrt nach Mexiko.mp4

    Wenn du Zugriff auf deine mp4 Dateien hast, verstehe ich das jetzt so, dass du nichts weiter machen musst als die Ordner zu erstellen und die Dateinamen zu ändern?

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (12. Oktober 2014 um 16:42)

  • Hallo Andy,
    genau so wie Du es oben beschrieben hast. Habe es soweit auch lauffähig bekommen. Es gibt zwar sicher noch einiges an Verbeserungspotential und mein Code gleicht auch eher einem Sphaghetti als einem Programm, aber dafür lerne ich ja auch noch. Im nächsten Schritt möchte ich das Ganze noch ein wenig hübsch machen und vielleicht eine GUI implementieren.

    Dank Blubbstar habe ich das Ganze zum Laufen bekommen. Vielen Dank nochmals. Die anderen Hinweise waren auch recht hilfreich für mich.
    Ich sehe ein das ich noch viel lernen muss. Auch finde ich es recht mühseelig den Code zu debuggen.

    P.S Wie kann ich mich hier im Forum nützlich machen. Würde gerne irgendwie dazu beitragen.

    Meine ursprüngliche Frage ist vollumfassend beantwortet. Wie setzte ich das Ganze nun auf gelöst.

    Gruß Michael