Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 27 Apr 2018, 09:55

Moin,
Aber Du kennst noch eine Möglichkeit dies mit einer Abfrage geschehen zu lassen? Ist dies kompliziert?
Was ich mir dachte, ist an sich nicht kompliziert. Inzwischen ist mir aber eine Alternative eingefallen.

In AHK gibt es die interne Variable A_TickCount. Sie enthält die Zeit in Millisekunden, die seit dem Start des Systems verstrichen ist. Es sollte deshalb reichen, in der Log-Datei den aktuellen Wert von A_TickCount zu speichern.

Weil Du die Dauer der Einblendung ohnehin aus den Differenzen der Einträge des aktuellen und des folgenden Log-Satzes bildest, könntest Du dann die Millisekunden direkt aus den Werten der Log-Sätze berechnen, d.h. auf die Funktion ConvertToMilliseconds() vollständig verzichten.

Wenn Du das änderst, wäre es gut, wenn bereits die Anzeige der ersten Einblendung protokolliert wird, im Beispiel "Bitte schalten Sie Ihr Mobiltelefon ab. Vielen Dank!" (falls Du das nicht sowieso machst). Außerdem ist es besser, wenn auf dem Rechner die Windows "Schnellstartoption" nicht aktiv ist (wird unter Win 10 standardmäßig aktiviert und (wurde zumindest) bei den großen Updates ungefragt reaktiviert). Ansonsten kann A_TickCount alle 49,7 Tage überlaufen und zurück auf Null gehen. Wenn Du Pech hast, geschieht das genau während einer Protokollierung. Wenn die Schnellstartoption aktiv bleiben soll, sollte auf dem Rechner vor dem Start der Protokollierung ein echter Neustart ausgeführt werden.

Außerdem habe ich mir noch einmal alle Deine Informationen durchgelesen und mir auch die letzte eingestellte Fassung Deines Skript genauer angeschaut. Es mag besser sein, wenn Dein Skript so prorammiert ist, dass Du es nachvollziehen kannst. Dennoch habe ich erst einmal zwei Anmerkungen:
  • Wenn Du Funktionen mit identischem Code mehrfach aufrufen willst, musst Du die nicht mehrfach mit unterschiedlichen Namen im Code ablegen. Du kannst deshalb ConvertToMilliseconds2() etc. wieder entfernen und die Aufrufe durch ConvertToMilliseconds() ersetzen. Außerdem ist es nicht üblich, die Funktionsdefinitionen mitten im aufrufenden Code unterzubringen.
  • Die Berechnung der Start- und Endezeiten für die Untertitel-Dateien sieht z.Zt. so aus:
    • Ersten Ausgabesatz ermitteln und Startzeit als "Versatz" speichern.
    • Schleife
      • Satz aus Log-Datei lesen und Start berechnen
        Beim ersten Mal ist das der Satz, der schon für die Bestimmung des Starts der Ausgabe gelesen wurde.
        Danach ist es der Satz, der schon für die Bestimmung des Endes der Anzeige gelesen wurde.
      • Folgesatz aus Log-Datei lesen und Ende berechnen.
Die Sätze der Log-Datei werden dabei zweimal gelesen. Dabei wird aus der Zeitangabe des Log-Satzes zuerst das Ende des aktuellen Satzes und danach der Start des folgenden Satzes berechnet. Ende und Start sind also identisch und die Rechnerei für Start ist unnötig. Start kann einfach mit dem errechneten Ende des Vorsatzes gefüllt werden. Für den ersten Ausgabesatz, dessen Start ja immert 00:00:00,000 ist, kann der Endwert vor Beginn der Schleife mit diesem Wert vorbelegt werden.

Um zu zeigen, was ich meine, habe ich diesen Teil Deines Skripts überarbeitet. Ich hoffe, dass ich keine Fehler eingebaut habe, denn ich konnte es nicht testen:

Code: Select all

break_outer4:

Versatz := word_a1

; Eingefügt, das muss nur einmal berechnet werden
Versatz := ConvertToMilliseconds(Versatz)

ZeileLVT := 1

Nummer := 1

; Eingefügt, Grundstellung für Ende, wird als Startwert für die erste Zeile der Ausgabe genutzt
Ende := "00:00:00,000"

Loop
{

   ; Lvt-Satz lesen
   FileReadLine, GanzeZeileLVT, UT-LVT.txt, %ZeileLVT%
   StringSplit, word_arrayLVT, GanzeZeileLVT, `|, .
   word_arrayLVT2 := SubStr(word_arrayLVT2, 1 , -1)
   word_arrayLVT3 := SubStr(word_arrayLVT3, 1 , -1)
   word_arrayLVT4 := SubStr(word_arrayLVT4, 1 , -1)
   word_arrayLVT5 := SubStr(word_arrayLVT5, 1 , -1)
   word_arrayLVT6 := SubStr(word_arrayLVT6, 1 , -1)
   word_arrayLVT7 := SubStr(word_arrayLVT7, 1 , -1)

   ; Zeilennumer des nächsten Satzes der Lvt-Datei bestimmen
   ZeileLVT += word_array2

   ; Start mit dem Ende des vorherigen Satzes versorgen
   Start := Ende

   ; Zeilennummer der Log-Datei auf den nächsten Satz setzen
   Zeile += 1

   ; Log-Satz lesen
   FileReadLine, GanzeZeile, %SelectedFile%, %Zeile%
   StringSplit, word_array, GanzeZeile, `;, .

   ; Fertig?
   If word_array1 contains asdfjklö
   {
      Goto break_outer5
   }

   ; Ende berechnen
   Millisekunden := ConvertToMilliseconds(word_array1)
   Differenz := Millisekunden - Versatz
   Ende := ConvertToHHMMSSMS(Differenz)

   ; Fehlerprüfung übernommen, kann das wirklich sein???
   If (Ende = "00:00:00,000")
   {
      Ende := Start
   }

   ; Satz für erste Sprache ausgeben
   FileAppend %Nummer%`n, Sprache1.srt
   FileAppend, %Start% --> %Ende%, Sprache1.srt
   FileAppend, `n%word_arrayLVT2%`n, Sprache1.srt
   FileAppend, %word_arrayLVT3%`n, Sprache1.srt
   FileAppend, %word_arrayLVT4%`n, Sprache1.srt

   ; Satz für zweite Sprache ausgeben
   FileAppend %Nummer%`n, Sprache2.srt
   FileAppend, %Start% --> %Ende%, Sprache2.srt
   FileAppend, `n%word_arrayLVT5%`n, Sprache2.srt
   FileAppend, %word_arrayLVT6%`n, Sprache2.srt
   FileAppend, %word_arrayLVT7%`n, Sprache2.srt

   ; Nummer für Ausgabedateien erhöhen
   Nummer += 1

}

break_outer5:
MsgBox, Fertig!
ExitApp

; Funktionen ans Ende geschoben
ConvertToMilliseconds(HHMMSSMS)
{
    HH := SubStr(HHMMSSMS, 1, 2) * 1000 * 3600
    MM := SubStr(HHMMSSMS, 4, 2) * 1000 * 60
    SS := SubStr(HHMMSSMS, 7, 2) * 1000
    MS := SubStr(HHMMSSMS, 10)
    return HH + MM + SS + MS
}

ConvertToHHMMSSMS(Milliseconds)
{
    HH := Milliseconds // 3600000
    remain := Mod(Milliseconds, 3600000)
    MM := remain // 60000
    remain := Mod(remain, 60000)
    SS := remain // 1000
    remain := Mod(remain, 1000)
    MS := Mod(remain, 1000)
    return Format("{:02}:{:02}:{:02},{:03}", HH, MM, SS, MS)
}
Du kannst Dir das ja mal anschauen. Ich habe ein paar Kommentare eingefügt, um es verständlicher zu machen. Wenn Du es willst, können wie auch noch weitermachen. Wenn Du aber lieber bei Deinem Code bleiben willst, ist das natürlich auch in Ordnung.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 27 Apr 2018, 01:19

Hi,
vielen Dank für Deine Anmerkungen zur Zeit. Ich habe das Skript jetzt etwas geändert, so dass ich den ersten Teil weglasse und A_MSec und A_Now direkt hintereinander einlese. Aber Du kennst noch eine Möglichkeit dies mit einer Abfrage geschehen zu lassen? Ist dies kompliziert?

Code: Select all

~Down::

Var := A_MSec
Zeit := A_Now
;FormatTime, Output4, A_Now, HH:mm:ss,%Var% ;Akutelle Zeit zum checken

	SetFormat, float, 03.0  ;Umrechnung in Schritten von jeweils 20 ms
	Var := Var / 20
	Var := Var * 20
	Var := Format("{:03}",Var)
	if Var contains 1000 ; Wenn 1000 ms sind, eine Sekunde addieren
	{
		Output1 = %Zeit%
		Output1 +=1, Seconds

		FormatTime, Output1, %Output1%, HH:mm:ss,000
		FileAppend, %Output1%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv
	}
	else ; trifft bei Werten von 000 bis 989 ms ein
	{
		FormatTime, Output2, %Zeit%, HH:mm:ss,%Var%
		FileAppend, %Output2%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv
	}
Zu Deinen Fragen:
1. Das Video wird nicht gestutzt, sondern der fertige Untertitel wird an die richtige Stelle, nämlich den Einsatz der Sprache, geschoben. Das ist ganz einfach.
2. In diesem Fall wird zwischen 00:00:03,960 und 00:00:04,120 kein Untertitel angezeigt. In meinem Skript würde dies jedoch anders aussehen, nämlich folgendermaßen:

Code: Select all

1
00:00:00,000 --> 00:00:03,960
Zeile1 deutsch
(fasls vorhanden) Zeile2 deutsch
(falls vorhanden) Zeile3 deutsch

2
00:00:03,960 --> 00:00:04,120

3
00:00:04,120 --> 00:00:08,160
Zeile4
(falls vorhanden) Zeile 5
Vom Ergebnis her ist es identisch.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 26 Apr 2018, 04:27

Nun zum eigentlichen Thema.

Ich glaube, ich habe es jetzt verstanden. Bleiben nur noch zwei 'technische Klarstellungen':
  1. Das aufgenommene Video wird so gestutzt, dass es mit der Einblendung der ersten 'echten' Textzeilen beginnt?
  2. Wie entsteht die zeitliche Lücke in Deinem Beispiel?
    1
    00:00:00,000 --> 00:00:03,960
    Zeile1 deutsch
    (fasls vorhanden) Zeile2 deutsch
    (falls vorhanden) Zeile3 deutsch

    2
    00:00:04,120 --> 00:00:08,160
    Zeile4
    (falls vorhanden) Zeile 5

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 26 Apr 2018, 03:48

Moin,

erst einmal zu dem Problem mit den Millisekunden. Ich glaube, Du machst Dir das zu kompliziert.

A_MSec kann nur Werte von 0 bis 999 enthalten, weil der Wert 1000 bereits in der nächsten Sekunde liegen würde. Das ist genau so wie bei der Variablen A_Sec, die nur Werte von 0 - 59 enthalten kann.

Ich gehe davon aus, dass Du das machst, weil das zu steuernde Programm nur Millisekundenwerte in zwanziger Schritten akzeptiert.

Wenn Du damit leben kannst, dass der Wert abgerundet wird, kannst Du das in einer Anweisung erledigen:

Code: Select all

MSec := A_MSec // 20 * 20 ; // = Division mit ganzahligem Ergebnis
Dabei ist ein 'Überlauf' auf 1000 nicht möglich.

Wenn Du lieber runden willst, geht das zunächst einmal auch mit einer Anweisung:

Code: Select all

MSec := (A_MSec + 10) // 20 * 20 ; + 10 zum Runden
Hier kann als Ergebnis aber auch 1000 entstehen, das nachbehandelt werden muss indem man die Millisekunden auf Null setzt und eine Sekunde auf die Zeit addiert. Das geht sehr einfach, wenn man die aktuelle Zeit A_Now bereits gespeicher hat:

Code: Select all

Now := A_Now
MSec := (A_MSec + 10) // 20 * 20
If (MSec > 980)
{
   MSec := 0
   Now += 1, S
}
Jetzt musst Du die Variable MSec nur noch mit führenden Nullen auffüllen. Das erledigt die Funktion Format(). Die Formatierungs "{:03}" bedeutet allerdings: "Fülle das Ergebnis mit Nullen auf, wenn es weniger als 3 Stellen hat". Wenn Du einen Wert mit 4 oder mehr Stellen übergibst, wird der unverändert ausgegeben.

Code: Select all

MSec := Format("{:03}", MSec)
Schließlich kannst Du Deinen kompletten Zeitstempel erstellen.

Code: Select all

FormatTime, OutPut, %Now%, HH:mm:ss,%MSec%
Der komplette Code sähe dann je nach Variante so aus:

Code: Select all

; Abrunden
Now := A_Now
MSec := A_MSec // 20 * 20 ; // = Division mit ganzzahligem Ergebnis
MSec := Format("{:03}", MSec)
FormatTime, Zeitstempel, %Now%, HH:mm:ss,%MSec%
MsgBox, %Zeitstempel%

; Runden
Now := A_Now
MSec := (A_MSec + 10) // 20 * 20  ; + 10 zum Runden
If (MSec > 980)
{
   MSec := 0
   Now += 1, S
}
MSec := Format("{:03}", MSec)
FormatTime, Zeitstempel, %Now%, HH:mm:ss,%MSec%
MsgBox, %Zeitstempel%
Noch ein abschließender Hinweis:
Wenn man sich Zeiten mit einer Genauigkeit im Millisekundenbereich aus verschiedenen Zeitvariablen zusammenbastelt, sollte man deren aktuelle Werte möglichst 'gleichzeitig' zwischenspeichern. Sonst erhöht sich das Risiko, dass die zuletzt gespeicherten Werte nicht mehr zu den vorher gespeicherten passen, wenn zwischendurch die Sekunde überläuft. Man kann man solche 'Fehler' aber nicht völlig ausschließen. Als Alternative bietet sich der Aufruf einer Systemfunktion an, die alle benötigten Werte mit nur einem Zugriff über die Systemzeit holt. Wenn Du daran Interessiert bist, kann ich Dir sowas geben.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 26 Apr 2018, 02:01

Guten Morgen,
ich habe nun endlich den Befehl FormatTime verstanden und damit konnte ich das Problem mit den Millisekunden lösen. Vielleicht geht es auch eleganter, aber ich froh, dass ich es hinbekommen habe:

Code: Select all

Var := A_MSec
FormatTime, Output4, A_Now, HH:mm:ss,%Var% ;Akutelle Zeit zum checken
if Var contains 1000 ; Abfrage, ob es genau 1000 Millisekunden sind
{
	FormatTime, Output1, A_Now, HH:mm:ss,000
	;FileAppend, %Output1%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv
	MsgBox, Fall1
}
else
{
	SetFormat, float, 03.0  ;Umrechnung in Schritten von jeweils 20 ms
	Var := Var / 20
	Var := Var * 20
	Var := Format("{:03}",Var)
	if Var contains 1000 ; Wenn 1000 ms sind, eine Sekunde addieren
	{
		Output2 = %A_Now%
		Output2 +=1, Seconds

		FormatTime, Output2, %Output2%, HH:mm:ss,000
		;FileAppend, %Output2%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv
		MsgBox, Fall2
	}
	else ; trifft bei Werten von 000 bis 989 ms ein
	{
		FormatTime, Output3, A_Now, HH:mm:ss,%Var%
		;FileAppend, %Output3%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv
		MsgBox, Fall3
	}
}


MsgBox, %Output1%%Output2%%Output3% Now: %Output4% ;MsgBox zum Funktionstest
Liebe Grüße!

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 25 Apr 2018, 12:59

Hi just me,
danke für Deine Anmerkungen. Ich versuche es nochmal etwas besser zu erklären. Die LVT-Datei existiert als allererstes. Der Text wird dort in beiden Sprachen eigegeben, da er bekannt ist. Während der Veranstaltung wird der Text (maximal 3 Zeilen) zur richtigen Zeit eingeblendet (nur der Übertitel), damit das Publikum mitlesen kann. Wenn nun eine Videoaufnahme von der Veranstaltung gemacht wird und dort der Text beider Sprachen eingeblendet werden soll. muss dieser ja eingegeben werden und der richtige Zeitpunkt bestimmt werden. Dies geschieht ja eigentlich schon während der Veranstaltung. Deswegen war meine Idee, die {Down}und die{Up}-Tasten mitzuloggen, die einen Titel im Saal weiterschalten und auch wieder zurück, falls man sich vertippt hat. Anschließend wähle ich den ersten relevanten Titel als 1. Titel aus und die Uhrzeit des ersten relevanten Tastendruck setze ich auf 00:00:00,000. Dadurch kann ich mir automatisch eine Untertitel-Datei basteln, die ich mit meinem Videoprogramm einlesen kann.

Die Anmerkung, dass nur der erste Akt ausgelesen wird, habe ich erst jetzt richtig verstanden. Hier könnte es tatsächlich zu einem Problem kommen. In meiner Beispiel-LVT-Datei ist der gesamte Text von drei Akten in einen einzigen Akt gepackt worden. Wahrscheinlich wird dies auch in Zukunft so gehandhabt, es könnte dennoch passieren, dass es mehrere Akte gibt. In Ragnars Skript taucht das Wort Akt nicht auf, wo würde man denn den Akt auswählen?

Deine zweite Anmerkung zu den Millisekunden kann ich gut nachvollziehen und hier ist das Skript wirklich nicht gut. Aber ich habe es nicht sauber hinbekommen. Eigentlich will ich etwas sehr einfaches, nämlich dass die Taste {Down} und{Up} geloggt wird, und zwar im Zahlenformat HH:MM:SS,FFF
FFF sind Millisekunden in Schritten von jeweils 20 ms.

Durch folgenden Code bekomme ich die gewünschten Schritte hin:

Code: Select all

Var := A_MSec
SetFormat, float, 03.0
Var := Var / 20
Var := Var * 20
Irgendwann war dann durch Zufall die Zahl 1000 hinter dem Komma, obwohl ich Format("{:03}" eingegeben habe. Deshalb dürften doch nur 3 Stellen da sein, oder? Gebe ich jedoch folgenden Code ein, wird die 1000 nicht zu 000 gemacht. Warum bloß?

Code: Select all

Var := 1000
SetFormat, float, 03.0
Var := Var / 20
Var := Var * 20
Var := Format("{:03}",Var)
MsgBox, %Var%
Damit das Zahlenformat nicht falsch ist, habe ich dann 1000 zu 000 gemacht, da ich dachte, dass 1000 MSec ja einer Sekunde entspricht und diese ist ja schon bei A_Min mitgezählt worden. Dein Einwand stimmt natürlich und von 990 bis 999 ms wäre das wirklich fast eine Sekunde zu wenig und das wäre sehr doof!

Ich rechne ja nur die Msec, den Rest nehme ich mir ja durch A_Hour, A_Min und A_Sec:

Code: Select all

Var1 =,
FileAppend, %A_Hour%:%A_Min%:%A_Sec%%Var1%%Var%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv
Das müsste ich komplett ändern und von 990 bis 999 ms hinter dem Komma 000 anzeigen lassen und eine Sekunde addieren. Aber diese eine Sekunde kann sich ja auch auf die Minuten und Stunden auswirken...
Das ganze ist ja so ähnlich, wie das Zeitskript, dass Du mir geschickt hast, aber ich verstehe es leider nicht ganz. Hast Du hier bitte nochmal einen Tip? Und ist jetzt der ganze Sinn meines Skriptes klar geworden?

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 25 Apr 2018, 11:21

Moin,

wenn das jetzt so läuft wie es soll, solltest Du Dein Skript so lassen.

Ich habe immer noch Probleme mit der Logik des Ganzen.
Eine Veranstaltung mit Sprache wird gefilmt. Gleichzeitig wird im Saal der Text eingeblendet, indem jemand den Text mitliest und bei der nächsten Zeile auf "Weiter" drückt. Dies sind die Übertitel der lvt-Datei. Des Weiteren befinden sich dann die Sprache1 und Sprache2 in der lvt-Datei, in der Beispieldatei deutsch und englisch.
Was soll mir das sagen? Wird die lvt-Datei während der Veranstaltung erstellt oder ist sie die Basis der 'Lesung'?
Ich lese nun die lvt-Datei aus und logge mit, wann derjenige, der die Titel im Saal wechselt, dies tut.
Ich sehe in Deinem Beispiel einer lvt-Datei keinen Hinweis darauf, wann der Text wechselt.
Im Prinzipt ist Ragnars Skript funktionstüchtig. Es könnte unter Umständen geschickt sein, einen einzelnen Akt auszulesen, aber ich kann auch einen langen Titel haben und zerschneide ihn dann in die einzelnen Akte.
Ich habe schon versucht zu erklären, dass Ragnars Skript immer nur die erste Szene des ersten Aktes ausliest. Du brauchst deshalb nie etwas zu 'zerschneiden'. Dir mögen aber Szenen oder ganze Akte fehlen.

Ich kann mir folgendes Szenario vorstellen:

Du hast eine irgendwann entstandene Log-Datei mit Zeitstempeln und eine irgendwann entstandene lvt-Datei. Du versuchst, beide Dateien zu 'synchronisieren' und für jede vorhandene Sprache eine eigene Datei für die Untertitelsteuerung auszugeben. Diese Dateien enthalten je Track eine laufende Nummer, eine Zeitangabe Von --> Bis und die tatsächlich gefüllten <text> Tags der jeweiligen Sprache als einzelne Zeilen. Ist das so richtig?
(Ein paar weitere Kleinigkeiten wären in diesem Fall noch zu diskutieren.)

Ich habe außerdem ein Verständnisproblem mit folgendem Code:

Code: Select all

Var := A_MSec
SetFormat, float, 03.0
Var := Var / 20
Var := Var * 20
Var := Format("{:03}",Var)
if Var contains 1000 
{
	Var :=000
}
Wozu ist das gut? Warum reicht nicht einfach

Code: Select all

Var := Format("{:03}", A_MSec)
? Bei A_MSec >= 990 verlierst Du so fast eine Sekunde.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 25 Apr 2018, 09:07

Hallo,
ich habe das Skript nun fertig gestellt und ich denke, es funktioniert bestens. Folgendes läuft ab. Eine Veranstaltung mit Sprache wird gefilmt. Gleichzeitig wird im Saal der Text eingeblendet, indem jemand den Text mitliest und bei der nächsten Zeile auf "Weiter" drückt. Dies sind die Übertitel der lvt-Datei. Des Weiteren befinden sich dann die Sprache1 und Sprache2 in der lvt-Datei, in der Beispieldatei deutsch und englisch.
Ich lese nun die lvt-Datei aus und logge mit, wann derjenige, der die Titel im Saal wechselt, dies tut. Den Zeitpunkt des ersten relevanten Übertitels im Saal setze ich auf Null und verbinde ihn nun mit den Titeln der lvt-Datei. Damit kann ich eine Untertitel-Datei automatisch erstellen, die dann den gesamten Text beinhaltet und vor allem an der richtigen Stelle den richtigen Text zeigt. Dies kann ich unter das Video legen.

Zu der Frage von just me. Im Prinzipt ist Ragnars Skript funktionstüchtig. Es könnte unter Umständen geschickt sein, einen einzelnen Akt auszulesen, aber ich kann auch einen langen Titel haben und zerschneide ihn dann in die einzelnen Akte. Ist das Prozedere jetzt einigermaßen verständlich?

Das Ausgabeformat ist jeweils eine Liste pro Sprache:
1
00:00:00,000 --> 00:00:03,960
Zeile1 deutsch
(fasls vorhanden) Zeile2 deutsch
(falls vorhanden) Zeile3 deutsch

2
00:00:04,120 --> 00:00:08,160
Zeile4
(falls vorhanden) Zeile 5

Hier ist der Code: Mitschreiben, wann während der Veranstaltung auf weiter oder zurück geklickt wird:

Code: Select all

Var1 =,


~Down::

Var := A_MSec
SetFormat, float, 03.0
Var := Var / 20
Var := Var * 20
Var := Format("{:03}",Var)
if Var contains 1000 
{
	Var :=000
}

 
FileAppend, %A_Hour%:%A_Min%:%A_Sec%%Var1%%Var%;1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv

return
 
~Up::
 
Var := A_MSec
SetFormat, float, 03.0
Var := Var / 20
Var := Var * 20
Var := Format("{:03}",Var)
if Var contains 1000 
{
	Var :=000
}

FileAppend, %A_Hour%:%A_Min%:%A_Sec%%Var1%%Var%;-1`n, C:\Autohotkey\Output\%A_YYYY%%A_MM%%A_DD%_UT-Log.csv

return
Dann folgt das Auslesen der LVT-Datei, bestimmen der ersten Zeile und das definieren des ersten relevanten Tastenklicks auf Weiter:

Code: Select all

FileSelectFolder, Folder
SetWorkingDir %Folder%
FileSelectFile, SelectedFile, 3, %Folder%, Open a file, Text Documents (*.lvt)
IniWrite, %Folder%, %A_ScriptDir%\Pfad.ini, Pfad, Pfad1


SetBatchLines -1
xml := ComObjCreate("MSXML2.DOMDocument.6.0")
xml.async := false
xml.load(SelectedFile)
pages := xml.selectSingleNode("/book/container/container/container").childNodes
Liste := FileOpen("Liste.txt", "w`n")
Startnummer := 0
Loop % pages.length
{
    if (A_Index <= Startnummer)
        continue
    n := A_Index - Startnummer 
    DE1 := pages.item(A_Index).selectSingleNode("track[1]/text[1]").text
    DE2 := pages.item(A_Index).selectSingleNode("track[1]/text[2]").text
    DE3 := pages.item(A_Index).selectSingleNode("track[1]/text[3]").text
    EN1 := pages.item(A_Index).selectSingleNode("track[3]/text[1]").text
    EN2 := pages.item(A_Index).selectSingleNode("track[3]/text[2]").text
    EN3 := pages.item(A_Index).selectSingleNode("track[3]/text[3]").text
    Liste.WriteLine(n "|" DE1 "#|" DE2 "#|" DE3 "#|" EN1 "#|" EN2 "#|" EN3 "#")
}

seite :=1
Loop
{
    FileReadLine, OutputVar, Liste.txt, %seite%
    if OutputVar contains 1|Bitte schalten Sie Ihr Mobiltelefon ab.#|Vielen Dank.#|#|#|#|#
    {
        goto, NextLine1
    }
    if OutputVar contains 2|#|#|#|#|#|#
    {
        goto, NextLine1
    }
    if OutputVar contains 3|Please turn off your mobile phone.#|Thank you.#|#|#|#|# 
    {
        goto, NextLine1
    }
    if OutputVar contains 4|#|#|#|#|#|#
    {
        goto, NextLine1
    }
      
    
    MsgBox, 4, erste Zeile finden, %OutputVar%
    
    IfMsgBox, yes
    {
        goto break_outer3
    }
    IfMsgBox, no
    {
        goto, NextLine1
   } 
    
    
    NextLine1:
    
        z=%seite%
        seite :=z+1
    
    
}

break_outer3:
z=%seite%
seite :=z-1

SetBatchLines -1
xml := ComObjCreate("MSXML2.DOMDocument.6.0")
xml.async := false
xml.load(SelectedFile)
pages := xml.selectSingleNode("/book/container/container/container").childNodes
Liste := FileOpen("UT-LVT.txt", "w`n")
Startnummer := seite
Loop % pages.length
{
    if (A_Index <= Startnummer)
        continue
    n := A_Index - Startnummer 
    DE1 := pages.item(A_Index).selectSingleNode("track[1]/text[1]").text
    DE2 := pages.item(A_Index).selectSingleNode("track[1]/text[2]").text
    DE3 := pages.item(A_Index).selectSingleNode("track[1]/text[3]").text
    EN1 := pages.item(A_Index).selectSingleNode("track[3]/text[1]").text
    EN2 := pages.item(A_Index).selectSingleNode("track[3]/text[2]").text
    EN3 := pages.item(A_Index).selectSingleNode("track[3]/text[3]").text
    Liste.WriteLine(n "|" DE1 "#|" DE2 "#|" DE3 "#|" EN1 "#|" EN2 "#|" EN3 "#")
}

FileDelete, Liste.txt

FileSelectFile, SelectedFile, 3, %Folder%, Log-Datei öffnen, Text Documents (*.csv)
FileAppend, asdfjklö`n, %SelectedFile%
;FileAppend, `nasdfjklö, 20180423_UT-Log.csv


zeile :=1
Loop
{
    FileReadLine, OutputVar, %SelectedFile%, %zeile%
	;FileReadLine, OutputVar, 20180423_UT-Log.csv, %zeile%
	StringSplit, word_a, Outputvar, `;, .
    MsgBox, 4, ersten Titel finden, %OutputVar%
    IfMsgBox, yes
    {
        goto break_outer4
    }
    IfMsgBox, no
    {
        z=%zeile%
        zeile :=z+1
    }
    
}

break_outer4:

Versatz = %word_a1%

ZeileLVT :=1

Nummer :=1

;FileSelectFile, LVTListe, 3, %Folder%, Untertitel-Liste auswählen, Text Documents (*.txt)

Loop,
{
	
	;FileReadLine, GanzeZeile, 20180423_UT-Log.csv, %zeile%
	
	FileReadLine, GanzeZeile, %SelectedFile%, %zeile%
	StringSplit, word_array, GanzeZeile, `;, .
	
	;FileReadLine, GanzeZeileLVT, %LVTListe%, %ZeileLVT%
	FileReadLine, GanzeZeileLVT, UT-LVT.txt, %ZeileLVT%
	StringSplit, word_arrayLVT, GanzeZeileLVT, `|, .
	word_arrayLVT2 := SubStr(word_arrayLVT2, 1 , -1)
	word_arrayLVT3 := SubStr(word_arrayLVT3, 1 , -1)
	word_arrayLVT4 := SubStr(word_arrayLVT4, 1 , -1)
	word_arrayLVT5 := SubStr(word_arrayLVT5, 1 , -1)
	word_arrayLVT6 := SubStr(word_arrayLVT6, 1 , -1)
	word_arrayLVT7 := SubStr(word_arrayLVT7, 1 , -1)
	
	if word_array1 contains asdfjklö
	{
		goto break_outer5
	}
	


Minuend := ConvertToMilliseconds(word_array1)
Subtrahend := ConvertToMilliseconds(Versatz)
Differenz := Minuend - Subtrahend
;MsgBox % ConvertToHHMMSSMS(Differenz)

ConvertToMilliseconds(HHMMSSMS)
{
    HH := SubStr(HHMMSSMS, 1, 2) * 1000 * 3600
    MM := SubStr(HHMMSSMS, 4, 2) * 1000 * 60
    SS := SubStr(HHMMSSMS, 7, 2) * 1000
    MS := SubStr(HHMMSSMS, 10)
    return HH + MM + SS + MS
}

ConvertToHHMMSSMS(Milliseconds)
{
    HH := Milliseconds // 3600000
    remain := Mod(Milliseconds, 3600000)
    MM := remain // 60000
    remain := Mod(remain, 60000)
    SS := remain // 1000
    remain := Mod(remain, 1000)
    MS := Mod(remain, 1000)
    return Format("{:02}:{:02}:{:02},{:03}", HH, MM, SS, MS)
}
	
	z=%zeile%
	zeile :=z+1
	
	x=%ZeileLVT%
	y=%word_array2%
	
	ZeileLVT :=x+y
	
	
	;FileReadLine, GanzeZeile, 20180423_UT-Log.csv, %zeile%
	FileReadLine, GanzeZeile, %SelectedFile%, %zeile%
	StringSplit, word_array_ende, GanzeZeile, `;, .

Minuend2 := ConvertToMilliseconds2(word_array_ende1)
Subtrahend2 := ConvertToMilliseconds2(Versatz)
Differenz2 := Minuend2 - Subtrahend2


ConvertToMilliseconds2(HHMMSSMS)
{
    HH := SubStr(HHMMSSMS, 1, 2) * 1000 * 3600
    MM := SubStr(HHMMSSMS, 4, 2) * 1000 * 60
    SS := SubStr(HHMMSSMS, 7, 2) * 1000
    MS := SubStr(HHMMSSMS, 10)
    return HH + MM + SS + MS
}

ConvertToHHMMSSMS2(Milliseconds)
{
    HH := Milliseconds // 3600000
    remain := Mod(Milliseconds, 3600000)
    MM := remain // 60000
    remain := Mod(remain, 60000)
    SS := remain // 1000
    remain := Mod(remain, 1000)
    MS := Mod(remain, 1000)
    return Format("{:02}:{:02}:{:02},{:03}", HH, MM, SS, MS)
}
	
	Zahl1 = % ConvertToHHMMSSMS(Differenz)
	Zahl2 = % ConvertToHHMMSSMS2(Differenz2)
    
    if Zahl2 = 00:00:00,000
    {
        Zahl2 = %Zahl1%
    }
	
	FileAppend %Nummer%`n, Sprache1.srt
	FileAppend, %Zahl1% --> %Zahl2%, Sprache1.srt
	FileAppend, `n%word_arrayLVT2%`n, Sprache1.srt
	FileAppend, %word_arrayLVT3%`n, Sprache1.srt
	FileAppend, %word_arrayLVT4%`n, Sprache1.srt
	
	FileAppend %Nummer%`n, Sprache2.srt
	FileAppend, %Zahl1% --> %Zahl2%, Sprache2.srt
	FileAppend, `n%word_arrayLVT5%`n, Sprache2.srt
	FileAppend, %word_arrayLVT6%`n, Sprache2.srt
	FileAppend, %word_arrayLVT7%`n, Sprache2.srt
	
	n=%Nummer%
	Nummer :=n+1
		
}

break_outer5:
MsgBox, Fertig!
ExitApp

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by LuckyJoe » 23 Apr 2018, 13:29

Hi,

ich hoffe, niemand ist mir böse, wenn ich auf Tools aufmerksam mache, die das Erstellen und Editieren von Untertiteln zu Videos recht einfach ermöglichen, wie z.B.:
Shotcut https://shotcut.org/download/ oder Subtitle Edit http://www.nikse.dk/. Beide Programme sind kostenlos und in der Bedienung wohl ganz simpel (mit Shotcut habe ich schon selber gearbeitet).
Vielleicht braucht man das Rad ja gar nicht neu zu erfinden?

Ansonsten: Viel Erfolg und herzliche Grüße
Lucky Joe

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 23 Apr 2018, 04:37

Moin,

ich bin schon etwas älter und begreife deshalb wohl nicht mehr alles ohne detaillierte Erklärung. Was ich brauche, um das Ganze zu verstehen, ist Folgendes:

Welche Felder aus den Zeilen der Ausgabedatei werden wie und wofür genutzt (am Besten mit einer Beipielzeile und Deinem Code)?

Könntest Du in Bezug auf mehrere Akte bzw. mehrere Scenen pro Akt noch weitere Informationen in der Ausgabedatei brauchen? Wenn ja, welche und wohin sollen die geschrieben werden?

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 23 Apr 2018, 04:23

Moin,

danke, dass Du Dich hier so ins Zeug legst! Ich will alle Titel der lvt-Datei in einem Videoprogramm als Untertitel einbinden. Während der Versanstaltung wird ein Übertitel nach dem anderen im Saal gezeigt und ich logge per AHK-Skript mit, wann dies passiert. Dann ziehe ich die Zeiten voneinander ab, damit der erste Untertitel bei 00:00:00,000 startet. Dann verknüpfe ich die Zeiten meiner Log-Datei mit den einzelnen Titeln der lvt-Datei, und zwar für deutsch und englisch getrennt. Manchmal ist auch nur eine Sprache da, aber dafür habe ich zur Zeit keine Beispieldatei. Danach schreibe ich einen einzelen langen Titel für mein Videoprogramm in folgenden Format:

Code: Select all

1
00:00:00,000 --> 00:00:03,960
Zeile1
Zeile2

2
00:00:04,120 --> 00:00:08,160
Zeile4
Zeile 5

3
00:00:08,320 --> 00:00:12,560
Das geht mit FileAppend ja sehr einfach. In meinem Videoprogramm habe ich dann ein eiziges Titel-Clip, welches den Text innerhalb des Clips wechselt. Ist eine Oper 3 Stunden lang, ziehe ich dieses Clip einfach drei Stunden lang auf und zertrenne es manuell nach den Akten. Dies ist sehr einfach. Wenn ich die lvt-Datei pro Akt auslese, muss ich auch wieder den Timecode des ersten Titels des zweiten und dritten Aktes auf 00:00:00,000 zurücksetzen. Das würde ich mir durch einen langen Titel ersparen.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 21 Apr 2018, 03:51

Moin,

natürlich habe ich eine Idee. Bevor ich aber etwas mache, würde ich gern wissen, wie Du die Ausgabedatei weiter verarbeitest. Der Inhalt einer Datei sollte ja möglichst dieser weiteren Verarbeitung entsprechen.

'Notlösungen' wie
... aber es kommt so selten vor, dass man kaum von einem Mehraufwand sprechen kann, wenn man meine Ausgabedatei dann an dieser Stelle zersägt.
sollte man nur nutzen, wenn im Skript überhaupt ein nennenswerter Mehraufwand entsteht. Und gerade wenn es "so selten vorkommt", erhöht sich das Risiko, dass man es nicht bemerkt. Außerdem müsste man in diesem Fall die Eingabedatei (.lvt) 'zersägen'. Welche Auswirkungen hätte es auf die Weiterverarbeitung, wenn die Ausgabedatei mehrere Akte enthält?

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 20 Apr 2018, 15:08

Hi just me,
natürlich ist es nicht elegant, aber da ich in meinen Fähigkeiten sehr limitiert bin, war dies eine Möglichkeit für mich.
Und Du hast richtig getippt, denn die Tracknummer 0 könnte man ganz weglassen und nur Tracknummer 1 und 2 auslesen. Dann würde man sich das Auswählen des Anfangs sparen.
Die verschiedenen Akte auszulesen, wäre zwar ein nettes Feature, aber es kommt so selten vor, dass man kaum von einem Mehraufwand sprechen kann, wenn man meine Ausgabedatei dann an dieser Stelle zersägt.
Hast Du eine Idee, wie man mit Ragnars Skript diese Tracknummer 0 am Anfang weglässt? Wenn nicht, ist es auch nicht so schlimm. Ich brauche das Skript nicht sehr oft und dann kann ich auch diese drei Klicks mehr verkraften.

Vielen Dank für Deine Anmerkungen!

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by just me » 20 Apr 2018, 03:08

Moin,

es scheint mir nicht besonders 'elegant', die XML-Datei zweimal auszuwerten und zu schreiben.

Deine Beispieldatei enthält eine interessante Struktur:

Code: Select all

<trackconfiguration>
   <track num="0">
      <name>Übertitel Saal</name>
      <fontfamily>Verdana</fontfamily>
      <fontsize>44</fontsize>
      <foreground>-1</foreground>
      <bold>false</bold>
      <italic>false</italic>
      <underline>false</underline>
      <left>false</left>
      <center>true</center>
      <right>false</right>
      <effect>9</effect>
      <vitesseArrivee>5</vitesseArrivee>
      <vitesseDepart>5</vitesseDepart>
      <retard>0</retard>
   </track>
   <track num="1">
      <name>DCH de</name>
      <fontfamily>Verdana</fontfamily>
      <fontsize>20</fontsize>
      <foreground>-1</foreground>
      <bold>false</bold>
      <italic>false</italic>
      <underline>false</underline>
      <left>true</left>
      <center>false</center>
      <right>false</right>
      <effect>0</effect>
      <vitesseArrivee>5</vitesseArrivee>
      <vitesseDepart>5</vitesseDepart>
      <retard>0</retard>
   </track>
   <track num="2">
      <name>DCH en</name>
      <fontfamily>Verdana</fontfamily>
      <fontsize>20</fontsize>
      <foreground>-1</foreground>
      <bold>false</bold>
      <italic>true</italic>
      <underline>false</underline>
      <left>false</left>
      <center>false</center>
      <right>true</right>
      <effect>0</effect>
      <vitesseArrivee>5</vitesseArrivee>
      <vitesseDepart>5</vitesseDepart>
      <retard>0</retard>
   </track>
</trackconfiguration>
Das könnte bedeuten:
  • Die Tracknummer 0 ist für einen speziellen Zweck reserviert: <name>Übertitel Saal</name>
  • Die Tracknummer 1 enthält die erste Sprachversion: <name>DCH de</name>
  • Die Tracknummer 2 enthält die zweite Sprachversion: <name>DCH en</name>
Es könnte also reichen, am Anfang die Seiten zu überspringen, die weder in Track1 noch in Track2 Text enthalten.

Auch diese Schachtelung ist interessant:

Code: Select all

<container type="Main">
   <name>Parsifal_de-en</name>
   <container type="Acte">
      <name>Akt 1</name>
      <container type="Scene">
         <name>Szene 1</name>
Das könnte bedeuten, dass eine .lvt Datei auch mehrere Acte Container mit mehreren untergeordneten Scene Containern enthalten kann. Dann würde der Suchpfad

Code: Select all

xml.selectSingleNode("/book/container/container/container").childNodes
nur die erste Szene des ersten Akts auslesen.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 20 Apr 2018, 01:55

So, durch Eure Hilfe ist der erste Teil des Skriptes fertig. Ich lasse das Skript zuerst die Liste schreiben und gehe dann mit einer MsgBox Zeile für Zeile durch. Sobald die erste richtige Zeile da ist, klicke ich in der MsgBox auf Yes und dann wird nochmal die Liste geschrieben, nun mit dem richtigen Anfang. In der letzten Zeile habe ich ein # zu den Trennstrichen | geschrieben. Ich lese die Kästchen folgendermaßen aus:

Code: Select all

StringSplit, word_array, GanzeZeile, `|, .
Wenn ich dies tue, sind aus irgendeinem Grund die Punkte weg, Ausrufezeichen und Fragezeichen jedoch nicht. # lösche ich dann mit SubStr()
Man hätte das mit Sicherheit noch etwas eleganter lösen können, aber da ich im Gegensatz zu Euch kein Profi bin, kann ich damit gut leben. Jetzt habe ich nur noch ein Problem mit dem Subrahieren von Zeiten. Ich hatte dies im falschen Forum gepostet und hoffe dennoch, hier eine Antwort zu bekommen. Vielleicht habt Ihr ja sogar Interesse. Nochmal vielen Dank für Euen Einsatz. Hier der abschließende Code:

Code: Select all

FileSelectFolder, Folder
FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.lvt)
SetWorkingDir %Folder%

SetBatchLines -1
xml := ComObjCreate("MSXML2.DOMDocument.6.0")
xml.async := false
xml.load(SelectedFile)
pages := xml.selectSingleNode("/book/container/container/container").childNodes
Liste := FileOpen("Liste.txt", "w`n")
Startnummer := 0
Loop % pages.length
{
    if (A_Index <= Startnummer)
        continue
    n := A_Index - Startnummer 
    DE1 := pages.item(A_Index).selectSingleNode("track[1]/text[1]").text
    DE2 := pages.item(A_Index).selectSingleNode("track[1]/text[2]").text
    DE3 := pages.item(A_Index).selectSingleNode("track[1]/text[3]").text
    EN1 := pages.item(A_Index).selectSingleNode("track[3]/text[1]").text
    EN2 := pages.item(A_Index).selectSingleNode("track[3]/text[2]").text
    EN3 := pages.item(A_Index).selectSingleNode("track[3]/text[3]").text
    Liste.WriteLine(n "|" DE1 "#|" DE2 "#|" DE3 "#|" EN1 "#|" EN2 "#|" EN3 "#")
}

seite :=1
Loop
{
    FileReadLine, OutputVar, Liste.txt, %seite%
    MsgBox, 4, erste Zeile finden, %OutputVar%
    IfMsgBox, yes
    {
        goto break_outer3
    }
    IfMsgBox, no
    {
        z=%seite%
        seite :=z+1
    }
    
}

break_outer3:
z=%seite%
seite :=z-1

SetBatchLines -1
xml := ComObjCreate("MSXML2.DOMDocument.6.0")
xml.async := false
xml.load(SelectedFile)
pages := xml.selectSingleNode("/book/container/container/container").childNodes
Liste := FileOpen("Liste.txt", "w`n")
Startnummer := seite
Loop % pages.length
{
    if (A_Index <= Startnummer)
        continue
    n := A_Index - Startnummer 
    DE1 := pages.item(A_Index).selectSingleNode("track[1]/text[1]").text
    DE2 := pages.item(A_Index).selectSingleNode("track[1]/text[2]").text
    DE3 := pages.item(A_Index).selectSingleNode("track[1]/text[3]").text
    EN1 := pages.item(A_Index).selectSingleNode("track[3]/text[1]").text
    EN2 := pages.item(A_Index).selectSingleNode("track[3]/text[2]").text
    EN3 := pages.item(A_Index).selectSingleNode("track[3]/text[3]").text
    Liste.WriteLine(n "|" DE1 "#|" DE2 "#|" DE3 "#|" EN1 "#|" EN2 "#|" EN3 "#")
}

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 19 Apr 2018, 15:32

Alles klar, ich teste es mal morgen ausgiebig!

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by Ragnar » 19 Apr 2018, 15:24

Kein Problem :thumbup:
festigrat wrote:Wenn der Text nun mit einer anderen Startnummer beginnt, könnte ich diese ja wahrscheinlich einfach ändern (Zeile 7), oder?
Ja, genau dafür ist diese Variable vorgesehen.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 19 Apr 2018, 15:08

Hallo Ragnar,

wow, das Skript habe ich eingebaut und es scheint perfekt zu funktionieren! Ich muss es morgen noch ausgiebig testen. Die anderen Trennzeichen sind sehr sinnvoll!!!
Wenn der Text nun mit einer anderen Startnummer beginnt, könnte ich diese ja wahrscheinlich einfach ändern (Zeile 7), oder? Ich weiß noch nicht sicher, ob es immer mit Seite 4 losgeht. Vielleicht muss ich mir noch ein Skript schreiben, welches eine Page nach der anderen anzeigt und sobald ich den ersten relevanten Titel sehe, ich diesen auswähle und dieser meine Startnummer ist.
Also, herzlichen Dank. Diese Lösung ist super genial!!! :-)

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by Ragnar » 19 Apr 2018, 12:43

Code: Select all

SetBatchLines -1
xml := ComObjCreate("MSXML2.DOMDocument.6.0")
xml.async := false
xml.load("Parsifal_de-en.lvt")
pages := xml.selectSingleNode("/book/container/container/container").childNodes
Liste := FileOpen("Liste.txt", "w`n")
Startnummer := 4
Loop % pages.length
{
    if (A_Index <= Startnummer)
        continue
    n := A_Index - Startnummer 
    DE1 := pages.item(A_Index).selectSingleNode("track[1]/text[1]").text
    DE2 := pages.item(A_Index).selectSingleNode("track[1]/text[2]").text
    DE3 := pages.item(A_Index).selectSingleNode("track[1]/text[3]").text
    EN1 := pages.item(A_Index).selectSingleNode("track[3]/text[1]").text
    EN2 := pages.item(A_Index).selectSingleNode("track[3]/text[2]").text
    EN3 := pages.item(A_Index).selectSingleNode("track[3]/text[3]").text
    Liste.WriteLine(n "|" DE1 "|" DE2 "|" DE3 "|" EN1 "|" EN2 "|" EN3)
}
Als Trennzeichen wäre z. B. "|" sinnvoller, weil manche Sätze ein Semikolon enthalten.

Re: Auslesen bestimmter Wörter aus einer html-ähnlichen Datei

Post by festigrat » 19 Apr 2018, 11:19

Hi, vielen Dank für Eure Ideen. Mit StrSplit bekomme ich tatsächlich auf einfache Weise die gesuchten Zeilen. Dass StrSplit die Daten gleich in ein Array schreibt, war mir gar nicht bekannt. Es ist ja sehr praktisch und damit komme ich auf jeden Fall weiter!
Ich kann mit dem Titel-Programm auch eine Textdatei exportieren, dann allerdings jeweils nur eine Sprache. Deswegen ist englisch nicht dabei. Beide Sprachen sind nur in der lvt-Datei.
Ragnars Variante wäre deshalb für mich sehr vorteilhaft, da die lvt-Datei sowieso vorliegt und ich nicht noch exportieren muss, was die Sache etwas verinfacht. Ich habe es allerdings mit dem Code noch nicht geschafft, einen Text zu extrahieren. Was würde ich denn anstatt /book/name schreiben, um an die erste Zeile zu gelangen?
Am Ende brauche ich z.B. eine csv- oder ini-Datei. Es muss beim Auslesen ersichtlich sein, was, welche Sprache ist und ob es 1, 2 oder 3 Zeilen sind.
z.B:
1;He! Ho! Waldhüter ihr,;Schlafhüter mitsammen!;Zeile 3 deutsch(ansonsten eine leeres Kästchen; Hey! Ho! Forest sentries indeed!;More like sleep's sentries!;Zeile 3 englisch

Bei He! Ho! fängt es ja an. Alles, was davor ist, kann weggelassen werden. In der Textdatei ist es für mich sehr einfach, vorne alles wegzulöschen.

Nochmals vielen Dank für Eure Hilfe. Ich bin dadurch sehr viel weitergekommen!

Top