christopherik
Goto Top

Text-Datei Bestimmte Werte auslesen und vergleichen

Hallo zusammen,

ich arbeite in einem Tonstudio und auch hier entwickeln sich neue Arbeitsweisen.
Mein Problem:
Ich habe eine .edl-Datei: Das ist eine Datei die Timecodes enthält, die ich in meine DAW (Aufnahme und Schnitt-Programm) laden kann. Mit dieser EDL-Datei wird meine Aufnahme automatisch umsortiert, sodass ich weniger Arbeit mit dem Schnitt habe. Der Inhalt einer EDL sieht bspw. so aus:

TITLE: 2023-02-14.wav
FCM: NON-DROP FRAME

001 01_Trint A  C       00:10:23:00 00:10:23:21 00:00:00:00 00:00:00:21
* FROM CLIP NAME: 2023-02-14.wav

002 01_Trint A  C       00:10:24:20 00:10:25:09 00:00:00:21 00:00:01:11
* FROM CLIP NAME: 2023-02-14.wav

003 01_Trint A  C       00:10:25:21 00:10:27:17 00:00:01:11 00:00:03:06
* FROM CLIP NAME: 2023-02-14t.wav

004 01_Trint A  C       00:10:28:16 00:10:31:10 00:00:03:06 00:00:06:01
* FROM CLIP NAME: 2023-02-14.wav

Das klappt auch alles und nun kommt mein Problem.
Diese Timecodes sind nur die Angaben für den Rohschnitt.
Die Angaben für den Feinschnitt werden danach von der Redaktion in einem Worddokument vorgenommen und sieht dann wie folgt aus:

HOST 4
[00:10:23] Hallo, Bettina. [00:10:23][0.3]

GAST 1
[00:10:24] Ja, hallo. [00:10:25][0.2]

HOST 5
[00:10:25] Hi. Schön, dass du da bist. [00:10:27][1.4]

GAST 2
[00:12:46] Ja, ich freue mich total. Schön, dass ihr mich einladet. [00:12:48][2.1]
[4.0]

Die Timecodes sind auch alle in diesem Worddokument vorhanden, bloß in einer neuen Reihenfolge und mit ausgeschriebenem Text, also wurden Sequenzen vom Ende der Aufnahme in die Mitte getextet, sodass ich eine neue Anordnung der Timecodes habe.

Meine Frage:
Ist es überhaupt möglich, dass ein Skript erstellt werden kann, dass aus dem Word-Dokument erstmal nur die Klammern und deren Inhalt ausliest (also meine Timecode-Angaben). Und dann anschließend mit meiner EDL-Datei vergleicht und dann die EDL-Datei neu ausrichtet an der aktuellen Reihenfolge aus den Werten des Word-Dokuments?

Vielen Dank und liebe Grüße
Christoph

Content-ID: 6046496396

Url: https://administrator.de/forum/text-datei-bestimmte-werte-auslesen-und-vergleichen-6046496396.html

Ausgedruckt am: 22.04.2025 um 05:04 Uhr

6017814589
6017814589 20.02.2023 aktualisiert um 15:11:49 Uhr
Goto Top
Hi.
Zitat von @chrsitopherik:
Die Timecodes sind auch alle in diesem Worddokument vorhanden, bloß in einer neuen Reihenfolge und mit ausgeschriebenem Text,
Aber in der Word-Datei ohne die letzten Digits für die Einzel-Frame-Angabe, man müsste also die Frameangaben in der EDL ignorieren, könnte dann aber zu Dubletten führen sollte es zwei Schnitte rein im Framebereich geben (innerhalb einer Sekunde).
Meine Frage:
Ist es überhaupt möglich, dass ein Skript erstellt werden kann, dass aus dem Word-Dokument erstmal nur die Klammern und deren Inhalt ausliest (also meine Timecode-Angaben). Und dann anschließend mit meiner EDL-Datei vergleicht und dann die EDL-Datei neu ausrichtet an der aktuellen Reihenfolge aus den Werten des Word-Dokuments?
Ja absolut kein Problem, aber Batch würde ich dafür ehrlich gesagt nicht mehr verwenden. Powershell,Python, c# etc. wäre schon eher geeigneter, die haben schon alle nötigen Werkzeuge an Bord und man braucht nicht dauernd zu externen oder zusätzlichen Tools greifen.

Aber das man Word für die Detaillierung nutzt ist mir jetzt auch noch nicht untergekommen, aber soll ja auch User geben die mit Powerpoint ihre Rechnungen ausdrucken face-big-smile.

Gruß h.

P.s. schöner Dreher im Usernamen 😉
colinardo
Lösung colinardo 21.02.2023 aktualisiert um 11:57:26 Uhr
Goto Top
Servus @chrsitopherik, willkommen auf Administrator.de!
Habe ich dir hier ein mögliches Grundgerüst für dein Vorhaben mit Powershell erstellt.
Wie @6017814589 aber schon angemerkt hat fehlen in deinem Word-Beispiel die letzten beiden Ziffern in den TimeCodes, habe diese deswegen im folgenden Skript einfach mal für die Zuordnung ignoriert, es werden also nur die ersten drei Zifferngruppen XX:XX:XX der Timecodes in der EDL ausgewertet, Falls das ein Fehler/Irrtum von deiner Seite war lässt sich das natürlich nachträglich noch korrigieren.
# =================================================
# source word file
$wordfile = 'E:\test.docx'  
# source edl file
$edlfile = 'E:\test.edl'  
# output path for new ordered edl file
$edlfile_new = 'E:\test_finecut.edl'  
# =================================================
$ErrorActionPreference = 'Stop'  
# function to get word document main raw text content (only supports new the OpenXML Formats *.docx *.dotm etc. not the old binary formats)
function Get-WordContent {
    param([parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$path)
    $doc = $null;$tmp = ''  
    try{
        Add-Type -AssemblyName System.IO.Compression
        Add-Type -AssemblyName System.IO.Compression.Filesystem
        $doc = [System.IO.Compression.ZipFile]::Open($path,[System.IO.Compression.ZipArchiveMode]::Read)
        $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"  
        $doc.Entries | ?{$_.FullName -match '^word/document\.xml$'} | %{[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$tmp)}  
        $xml = New-Object XML
        $xml.Load($tmp)
        return $xml.DocumentElement.innerText
    }catch{
        throw $_
    }finally{
        if ($doc){$doc.Dispose()}
        if($tmp -ne ''){remove-item $tmp -EA SilentlyContinue -Force}  
    }
}

# get wordfile content
$wordcontent = Get-WordContent $wordfile
# get edlfile content
$edlcontent = Get-Content $edlfile -raw
# get timecodes from word file
$word_timecodes = [regex]::matches($wordcontent,'(?is)\[(\d{2}:\d{2}:\d{2})\].*?\[(\d{2}:\d{2}:\d{2})\]').Captures | %{"$($_.Groups[1].Value) $($_.Groups[2].Value)"}  
# get header from edl file
$edl_header = [regex]::match($edlcontent,'(?ism)^TITLE:.*?(?=^\d{3})').Value.trim()  
# create ordered hashtable
$edl_order = [ordered]@{}
# add edl entries to hashtable
[regex]::matches($edlcontent,'(?ism)^\d+\s.*?(\d{2}:\d{2}:\d{2}):\d{2} (\d{2}:\d{2}:\d{2}):\d{2}.*?(?=^\d+\s|\z)').Captures | %{  
    $edl_order."$($_.Groups[1].Value) $($_.Groups[2].Value)" = $_.Value.trim()  
}
# output header and word ordered edl entries to new edlfile with leading counters rewritten
$edl_header,($word_timecodes | %{$cnt=1}{$edl_order.$_ -replace '^\d+',('{0:D3}' -f $cnt);$cnt++}) | Set-Content $edlfile_new  
Individuelle Anpassung gerne nach Absprache bei Bedarf auch per PN.

Grüße Uwe
colinardo
colinardo 27.02.2023 aktualisiert um 15:57:57 Uhr
Goto Top
Keine Rückmeldung ist auch eine face-sad. <closed>