Filmtitel aus txt-formatierter Datei auslesen, auswählen und in String mit Filmtitel speichern

  • Hallo Community,

    ich nehme per dig. Sat-Receiver Sendungen auf eine externe HDD auf.
    Danach kopiere ich per erstelltem Script alle Dateien in ein im lokalen Netzwerk erstellten Ordner.

    Mit der Aufnahme wird eine "vid.epg"-Datei (elektronischer Programmführer) erstellt (txt-formartiert).

    Diese Datei beinhaltet alle bei der Aufnahme erstellten Aufnahmetitel (mit Inhaltsangabe).
    Ich möchte gerne per Script die Titel auslesen und für das Abspeichern in einen String zur Auswahl stellen.
    Dazu passend soll der Inhalt der ausgewählten Sendung in einen zweiten String gespeichert werden.

    Hier der Inhalt einer "vid.epg":

    <tv version=0.0.1>
    <event id=356 start=-1608 duration=1800 channel-id=12040-0-1089>
    <title>|Hotel Zack & Cody</title>
    <desc>|Folge 25 : 'Klug und klügerer'. Zacks Zeugnis lässt zu wünschen übrig. Da behauptet er einfach, ein Legastheniker zu sein. Und alle nehmen Rücksicht auf ihn.</desc>
    </event>
    <event id=414 start=192 duration=3000 channel-id=12040-0-1089>
    <title>|Die Neandertaler - Überlebenskampf der Clans</title>
    <desc>|Wer waren die Neandertaler? 250.000 Jahre lebte die Menschenart auf der Erde. Die Neandertaler trotzten Kälteperioden, setzten Sprache gezielt ein und behaupteten sich erfolgreich gegen andere Menschenarten. Die Dokumentation wirft einen Blick auf wissenschaftliche Erkenntnisse und begleitet Neandertaler in Spielszenen bei Raubzügen und im Alltagsleben.</desc>
    </event>
    <event id=339 start=3190 duration=3600 channel-id=12040-0-1089>
    <title>>|Die Neandertaler - Aufbruch ins Ungewisse</title>
    <desc>|Wer waren die Neandertaler? 250.000 Jahre lebte die Menschenart auf der Erde. Die Neandertaler trotzten Kälteperioden, setzten Sprache gezielt ein und behaupteten sich erfolgreich gegen andere Menschenarten. Die Dokumentation setzt sich mit wissenschaftlichen Erkenntnisse auseinander und stellt in inszenierten Szenen das Alltagsleben der Neandertaler nach.</desc>
    </event>
    <event id=399 start=6788 duration=5400 channel-id=12040-0-1089>
    <title>|Die Schlachten von Shaker Heights</title>
    <desc>|Zwei Teenager, die unterschiedlicher kaum sein könnten: Bart, ein angepasster, kultivierter Junge aus reichem Haus und Kelly, ein eigensinniger Einzelgänger aus schwierigen Verhältnissen. Was die beiden eint, ist ihr Geschichtsinteresse und ihr detailliertes Wissen über berühmte Kriegsschlachten. Und mit diesem Wissen lassen sie nicht nur Kellys verhassten Geschichtslehrer Norway alt aussehen, sondern schaffen es auch dessen Sohn, dem größten Schläger der Schule, eins auszuwischen.</desc>
    </event>
    -----------------

    Im obigen Beispiel möchte zwei Aufnahmen mit Titel und Inhalt in Strings per Auswahl übernehmen und weiterverarbeiten.
    -----------------
    Titel 1: "Die Neandertaler - Überlebenskampf der Clans"

    Inhalt 1: "Wer waren die Neandertaler? 250.000 Jahre lebte die Menschenart auf der Erde. Die Neandertaler trotzten Kälteperioden, setzten Sprache gezielt ein und behaupteten sich erfolgreich gegen andere Menschenarten. Die Dokumentation wirft einen Blick auf wissenschaftliche Erkenntnisse und begleitet Neandertaler in Spielszenen bei Raubzügen und im Alltagsleben."
    -----------------
    Titel 2: "Die Neandertaler - Aufbruch ins Ungewisse"

    Inhalt 2: "Wer waren die Neandertaler? 250.000 Jahre lebte die Menschenart auf der Erde. Die Neandertaler trotzten Kälteperioden, setzten Sprache gezielt ein und behaupteten sich erfolgreich gegen andere Menschenarten. Die Dokumentation setzt sich mit wissenschaftlichen Erkenntnisse auseinander und stellt in inszenierten Szenen das Alltagsleben der Neandertaler nach."
    -----------------

    Kann mir bitte jemand helfen?!

    Einmal editiert, zuletzt von ratatoui (7. Juli 2010 um 14:04)

  • StringRegExp(FileRead($File), "<title>|(.*)</title>" & @CRLF & "<desc>|(.*)</desc>", 3)

    @PokerFece:_StringBetweenist scheiße

  • Deine Meinung zu _stringBetween() begründest du bitte wie? Die Funktion hat in vielen Situationen durchaus Vorzüge gegenüber regex.
    Ausserdem funktioniert dein regex nicht.

    [autoit]


    #include<array.au3>
    $hFile = FileOpen(@ScriptDir & "\test.txt")
    $string = FileRead($hFile)
    $result = StringRegExp($string, "<title>\|(.*?)</title>" & @CRLF & "<desc>\|(.*?)</desc>", 3)
    _ArrayDisplay($result)

    [/autoit]
  • Ich find StringBetween sehr gut !

    Hier mal für Neulinge:

    [autoit]


    #include <String.au3>

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

    $Open = FileOpen("vid.epg", "0")
    $Content = FileRead($Open)
    FileClose($Open)
    $Title = _StringBetween ($Content, "<title>|", "</title")
    $Desc = _StringBetween ($Content, "<desc>|", "</desc")
    For $i = 0 to UBound ($Title)-1
    FileWrite ("Titel und Inhalt.txt", "Titel "&$i+1&": "&$Title[$i]&@CRLF&"Inhalt "&$i+1&": "&$Desc[$i]&@CRLF&@CRLF)
    Next

    [/autoit]

    Wirkt für Experten unsauber, aber du verstehst leichter wie es funktioniert.

  • Hi,
    vielen Dank erstmal für die schnellen Antworten.

    Habe mich mit dem Lösungsansatz von "PokerFace" beschäftigt:

    Zitat

    $Title = _StringBetween ($Content, "<title>|", "</title")
    $Desc = _StringBetween ($Content, "<desc>|", "</desc")

    Die Datei "Titel und Inhalt.txt" wird erst erstellt, wenn ich zuvor aus dem Script die pipes "|" entfernt habe.
    Es scheint sich hierbei um ein Steuerzeichen zu handeln, so dass nach der Änderung folgender Datei-Inhalt erstellt wird:


    Habe mal die "vid.epg" in "vid.txt" unbenannt und hier eingefügt:

    Wie bekomme ich nun die Titel zu einer Auswahl angezeigt, mit der ich dann weiterarbeiten kann?

  • Also wenn ich hier deine vid.txt nehme, dann kommt bei mir alles richtig raus.
    Also ohne die " | ".

    Zu 2. Frage:
    In meinem Skript bekommst du Arrays ($Title[x] und $Desc[x]).
    Mit denen kannst du dann weiterarbeiten.
    Siehe:

    [autoit]

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

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

    $Open = FileOpen("vid.epg", "0")
    $Content = FileRead($Open)
    FileClose($Open)
    $Title = _StringBetween ($Content, "<title>|", "</title")
    $Desc = _StringBetween ($Content, "<desc>|", "</desc")
    _ArrayDisplay($Title)
    _ArrayDisplay($Desc)
    MsgBox (0, "", "Die Anzahl der Einträge im Array $Title liegt bei: "&UBound($Title)-1) ;UBound($Array)-1 = Gesamtanzahl der Einträge bei 0 beginnend.
    MsgBox (0, "", "Die Anzahl der Einträge im Array $Desc liegt bei: "&UBound($Desc)-1)
    ;Beispiel zum Weiterverwenden:
    For $i = 0 to UBound($Title)-1 ;Übersetzt: Für alle Einträge von $i(=0) bis zur maximalen Anzahl der Einträge des Arrays
    MsgBox (0, "", $Title[$i]) ;soll eine MsgBox erstellt werden. Mit dem Inhalt des momentan verwendeten Eintrags.
    Next ; Nächster Eintrag verarbeiten

    [/autoit]

    Ich hoffe die Kommentare helfen dir.

    Einmal editiert, zuletzt von PokerFace (30. Juni 2010 um 23:23)

  • Hi PokerFace,
    danke für deine Tipps, besonders für die Erläuterungen im Code.
    Dies hilft mir als Anfänger ungemein.

    Ich glaube, dass das Problem mit dem "pipes" nur an meinem PC auftritt.
    (Ist eventuell eine Einstellung im Editor SciTE nötig?)

    Dein Code im Post #9 funktioniert bei mir nur, wenn ich die "pipes" entferne und bei der letzten MsgBox mit einer Klammer schliesse.
    Ansonsten erscheint bei der ersten MsgBox folgender Fehler:
    "Die Anzahl der Einträge im Array $Title liegt bei: -1"

    Bei der zweiten MsgBox erscheint:
    "Die Anzahl der Einträge im Array $Desc liegt bei: -1"

    Gruß
    Ratatoui

  • Ach Entschuldigung !
    Ich hab mich vertippt.
    Klar die MsgBox musst du zumachen.
    Wahrscheinlich kommen die Pipes nur, wenn man die original Datei öffnet.
    Wenn ich diese hier benutze:

    Dann erhalte ich OHNE pipes.
    Falls die jetzt immernoch bei dir bleiben, dann bin selbst ich überfragt.

    Auf jeden Fall kannst du deine Variabeln weiter verwenden:
    $Title[0] = Erster Titel
    $Title[1] = Zweiter Titel

    Eigentlich recht simpel. :rolleyes:

    Sobald fragen aufkommen, meld dich! :)

  • Hallo PokerFace,
    danke für deine Antwort.
    Ich habe mal deine "nicht-formartierte" Datei getestet und siehe da, es funktioniert!.
    Vielen Dank erstmal.

    @ideas2code
    Auch dir schönen Dank.
    Dein Script funktioniert bei mir auch nur mit der "nicht-formartierten" Datei (also wenn keine TABs vorliegen).
    Es ist mir aufgefallen, dass die 2. Sendung "Die Neandertaler - Aufbruch ins Ungewisse" nicht im ArrayDisplay angezeigt wird.

    Gruß
    raratoui

  • Hey.
    Das liegt daran:
    <title>>|Die Neandertaler - Aufbruch ins Ungewisse</title>

    Mit StringBetween suche ich Strings die mit <title>| anfangen.
    Aber hier sind 2 >.
    Ich denke mal das das igrendwie ein Tippfehler ist.
    Oder steht in der epg Datei wirklich bei der Sendung <title>>| ?

    PS:
    Wenn du das eine > wegmachst, dann gehts. :)

  • Hi PokerFace,
    du hast Recht !
    Ich habe wohl versehtlich ein > eingefügt.
    Auf jeden Fall funktionieren nun beide Beispiele mit der vid.txt (ohne TABs).
    Nun muss ich nur noch die vorhandenen TABs aus der Originaldatei vid.epg entfernen.

    Danke.

  • Aha,
    habe nun, um das Problem mit den TABs zu umgehen, folgende Lösung: [Blockierte Grafik: http://www.autoit.de/wcf/images/smilies/ylsuper.gif]

    Ich habe mit einem HEX-Editor die vid.epg-Datei (Originaldatei des Sat-Receivers) untersucht:

    Es handelt sich um ein Steuerzeichen, das bei mir das Problem erzeugt.
    Dieses kann man jedoch umgehen, wenn man das Steuerzeichen in einen Character umwandelt:

    [autoit]

    $Title = _StringBetween ($Content, "<title>" & Chr(5), "</title")
    $Desc = _StringBetween ($Content, "<desc>" & Chr(5), "</desc")

    [/autoit]

    2 Mal editiert, zuletzt von ratatoui (1. Juli 2010 um 17:35)

  • Na ja,
    ich erstelle zurzeit ein Script, um Videoaufnahmen eines dig. SAT-Receivers mit bestimmbaren Ordner und Dateinamen in eine Datei zu kopieren (TS-Format).
    Hierzu habe ich mir eine Batch erstellt:

    Code
    rem  zum Start-Ordner wechseln
    cd D:\VM-DAT\TV\TRP-Videos\Terra-X-Faszination-Erde
    rem Kopiere die einzelnen Videodateien zusammen in eine *.TS-Datei (in einen anderen Ordner)
    copy /b  vid.trp+vid.001+vid.002+vid.003+vid.004+vid.005+vid.006+vid.007+vid.008+vid.009+vid.010+vid.011+vid.012+vid.013+vid.014+vid.015+vid.016+vid.017+vid.018+vid.019+vid.020 Z:\!-TS\Terra-X-Faszination-Erde.ts
    exit

    Die vielen angehängten vid.* Dateien habe ich angegeben, da ich beim Kopieren nicht weiß, wieviele vid-Dateien vorhanden sind.

    Der DOS-Befehl Copy /b kopiert die binären Videodateien zu einer zusammen (append-funktion)

    Leider habe ich im Forum noch keinen Ersatz für Copy /b gefunden.

    Hast du vielleicht eine Idee?

    Einmal editiert, zuletzt von ratatoui (1. Juli 2010 um 17:40)

  • In AutoIt geht das sowie ich weiß nicht.
    Aber du kannst die Batch eigentlich komplett weglassen und dann eben mit AutoIt alles schreiben.
    Das wäre sogar noch kürzer.
    Außerdem kannst du die genaue Anzahl an .vid Dateien bekommen.


    Ich versuch dir das mal zu basteln.
    Dazu brauche ich nur ein paar Infos.
    Ordner der Dateien: D:VM-DAT\TV\TRP-Videos\*Name der Sendung*
    Ausgeführt werden muss: copy /b *Alle Dateien im Ordner*

    Hab ich das so richtig verstanden`?

  • Hi PokerFace,
    ja, du hast verstanden.

    Zitat

    Ordner der Dateien: D:VM-DAT\TV\TRP-Videos\*Name der Sendung*
    Ausgeführt werden muss: copy /b *Alle Dateien im Ordner*

    Nähere Erläuterung:
    Bislang hatte ich den Ordner manuell erstellt mit dem Namen der Sendung, der sich in der vid.epg Datei auslesen lässt.

    Deshalb auch mein derzeitiger Thread.
    Ich wollte mir die Titel der Sendungen in der vid.epg anzeigen lassen, gewünschten Titel markieren und in einen String kopieren lassen, um dann damit den Ordnernamen zu erstellen.

    Danach würden die Videodateien in den neu erstellten Ordner kopiert werden.

    Bsp:
    Ordner der Dateien: C:\!-TRP\Die Neandertaler - Überlebenskampf der Clans

    Anschließend:
    Ausgeführt werden muss: copy /b *Alle Dateien im Ordner*
    Es soll eine TS-Datei erstellt werden, Bsp:

    Dateiname: Die Neandertaler - Überlebenskampf der Clans.ts