max5moritz
Goto Top

Zwei Werte aus zwei Text-Dateien vergleichen und einen dritten Wert, an eine Zeile anhängen

Hallo Freunde der einzeiligen Schleifen,

und natürlich auch alle anderen einen schönen Abend, verbunden mit der Bitte, mir zu helfen, folgendes Problem zu lösen:

Es geht um das Auslesen zweier Text-Dateien die wie folgt aussehen:

1. Datei, aufbereitet aus mPlayer:

Video;1;5750;0;;;MPEG2;720x576;3;25;.=;
Audio;1;5750;0;de;5;ac3;5.1;;;128;
Audio;1;5750;1;de;5;dts;5.1/6.1;;;137;
Audio;1;5750;2;en;5;ac3;5.1;;;130;
Audio;1;5750;3;en;5;ac3;stereo;;;131;
Audio;1;5750;4;en;5;ac3;stereo;;;132;
Subti;1;5750;1;de;2;;;;;;
Subti;1;5750;3;de;2;;;;;;

2. Datei, aufbereitet aus den Infos von ffmpeg:
0:0;[0x1e0];Video;mpeg2;720x576;;vid211;normal;-vcodec copy;mp4;SAR 64:45 DAR 16:9,Stream-0  
1:0;[0x84];Audio;ac3;stereo;224 kb/s;aud511;demux;-acodec copy;ac3,Stream-1 
2:0;[0x83];Audio;ac3;stereo;224 kb/s;aud522;demux;-acodec copy;ac3,Stream-2 
3:0;[0x82];Audio;ac3;5.1(si;448 kb/s;aud633;demux;-acodec copy;ac3,Stream-3 
4:0;[0x80];Audio;ac3;5.1(si;448 kb/s;aud644;demux;-acodec copy;ac3,Stream-4 
5:0;[0x89];Audio;dts;5.1(si;768 kb/s;aud655;demux;-acodec copy;dts,Stream-5 

Nein, die Infos stammen von der selben Input-Datei. Es erkennt halt jeder was für wichtig hält face-wink
Dazu kommt, dass mplayer die Reihefolge wählt, ich ich zwar als richtig empfinde - bezogen auf die audiovisuelle Wiedergabe. Doch leider sieht der VLCplayer die Sache wieder nur so, wie es von ffmpeg gezeigt / angeboten wird.

Was will ich?:

Aus der 1. Datei die Info "de" aus der Zeile mit der niedrigsten Endnummer=128 an die Zeile angehängt die in der 2. Datei die niedrigste Nr. "x84" hat (gleichen Format: Audio natürlich).

Sollte es für die Lösung zwingend oder hilfreich sein, dass die zuvergleichende Werte 128< aus 1. und 84< aus 2. und, dass das Stichwort "Audio" stets am Zeilenanfang stehen sollte, so geht davon aus, dass das so ist.

Das Aussehen dieser Dateien liegt in meiner Hand, leider nicht deren Inhalte...

Ich hoffe auf gute Lösungsansätze, denn im Moment habe ich keinen Plan, wie ich diese Schleifen binden müßete.

Gruß
max5moritz

Content-ID: 201195

Url: https://administrator.de/contentid/201195

Ausgedruckt am: 21.11.2024 um 16:11 Uhr

rubberman
rubberman 03.02.2013 um 18:11:35 Uhr
Goto Top
Hallo max5moritz.

Zitat von @max5moritz:
Aus der 1. Datei die Info "de" aus der Zeile mit der niedrigsten Endnummer=128 an die Zeile angehängt die in der 2. Datei die niedrigste Nr. "x84" hat (gleichen Format: Audio natürlich).

Sollte es für die Lösung zwingend oder hilfreich sein, dass die zuvergleichende Werte 128< aus 1. und 84< aus 2. und, dass das Stichwort "Audio" stets am Zeilenanfang stehen sollte, so geht davon aus, dass das so ist.

Kannst du das bitte noch mal überdenken / konkretisieren?
Der niedrigste HEX Wert in der 2. Datei ist x80. Hex 0x84 = Dec 132. Da passt was nicht in deiner Erklärung.

Grüße
rubberman
max5moritz
max5moritz 03.02.2013 aktualisiert um 19:12:36 Uhr
Goto Top
Guten Abend @rubbermann,

ja gerne,
x84 ist nicht wirklich ein Hex-Wert, allein die Zahl ist ausschlaggebend, d.h.:
1. Die niedrigste Zahl für die Audio-Streams aus 1. Datei ist die 128, letzter Wert in Zeile 2
2. Die niedrigste Zahl für die Audio-Streams aus 2. Datei ist die 80 (ohne x), 2. Wert in Zeile 5

Beide Zeile beschreiben den selben Stream.

Nun brauche ich noch den Sprachwert ("de") aus der 2.Zeile von 1. als Anhang in Zeile 5 von 2. usw. usf.
oder als Inhalt für den 7. Wert aus Zeile 5 die Variable gefüllt mit
set "aud644=de"  
- das wäre die Lösung meines Problems.
Bitte beachten aud ist in der Zahl variabel. Dass ich den Srachewert für alle Zeilen brauche ist, denke ich, nachvollziebar.

Eigentlich ist das bereits eine "sprechende" Variable= 4. AudiStream, in Klasse-6-Format=Mehr-Kanal-ac3, d.h. Fall sox. Doch das tut eigentlich nichts zur Sache.

Danke für Dein Interesse, ich hoffe auf einen guten Lösungsansatz.

Grüße
max5moritz
rubberman
rubberman 03.02.2013 aktualisiert um 19:08:44 Uhr
Goto Top
Hallo max5moritz.

X84 ist nicht wirklich ein Hex-Wert
Bist du sicher?
0x80 = 128
0x82 = 130
0x83 = 131
0x84 = 132
0x89 = 137

Worauf ich hinaus will ist, dass numerische Vergleiche zwischen Hex- und Dec-Werten in einer Batchdatei direkt funktionieren und auch die Konvertierung von Hex zu Dec per SET /A simpel ist. Wenn die Dezimalwerte der ersten Datei ihre Hexadezimalentsprechungen in der 2. Datei haben, dann vereinfacht das das Suchen.

Grüße
rubberman
max5moritz
max5moritz 03.02.2013 aktualisiert um 19:20:26 Uhr
Goto Top
Sorry, dass ist mir nicht bewußt gewesen. Ich bin mit den Hex-Zahlen nicht vertraut. Nun ist mir aber klar, woher der mplayer seine 128 hat.

Gut, wenn sich das Problem dadurch vereinfacht. Nur weiss ich mir dennoch dafür keine Lösung, wie ich den Sprachwert aus Zeile 2/Datei 1 in die Zeile 5/Datei 2 bekomme.


Grüße
max5moritz
Friemler
Friemler 03.02.2013 aktualisiert um 20:02:04 Uhr
Goto Top
Hallo max5moritz,

teste mal folgendes:
@echo off & setlocal enabledelayedexpansion

set "InFile1=.\Datei1.txt"  
set "InFile2=.\Datei2.txt"  
set "OutFile=.\Out.txt"  


(for /f "usebackq eol=° delims=" %%a in ("%InFile2%") do (  
   set "Line2=%%a"  
   set "Type2="  
   set "Num2="  

   for /f "eol=° tokens=2,3 delims=;" %%b in ("!Line2!") do (  
     set /a Num2=%%b
     set "Type2=%%c"  
   )

   for /f "usebackq eol=° delims=" %%c in ("%InFile1%") do (  
     set "Line1=%%c"  
     set "Type1="  
     set "Lang="  
     set "Num1="  
     set /a Cntr=1

     for %%d in ("!Line1:;=","!") do (  
       if !Cntr! equ 1  (if "%%~d" neq "" (2>NUL set "Type1=%%~d"))  
       if !Cntr! equ 5  (if "%%~d" neq "" (2>NUL set "Lang=%%~d"))  
       if !Cntr! equ 11 (if "%%~d" neq "" (2>NUL set /a Num1=%%~d))  
       set /a Cntr+=1
     )

     if "!Num1!" neq "" if !Num1! equ !Num2! if "!Type1!" equ "!Type2!" set "Line2=!Line2!;!Lang!"  
   )

   <NUL set /p "=!Line2!" & echo.  
)) > "%OutFile%"  

Aus
0:0;[0x1e0];Video;mpeg2;720x576;;vid211;normal;-vcodec copy;mp4;SAR 64:45 DAR 16:9,Stream-0
1:0;[0x84];Audio;ac3;stereo;224 kb/s;aud511;demux;-acodec copy;ac3,Stream-1
2:0;[0x83];Audio;ac3;stereo;224 kb/s;aud522;demux;-acodec copy;ac3,Stream-2
3:0;[0x82];Audio;ac3;5.1(si;448 kb/s;aud633;demux;-acodec copy;ac3,Stream-3
4:0;[0x80];Audio;ac3;5.1(si;448 kb/s;aud644;demux;-acodec copy;ac3,Stream-4
5:0;[0x89];Audio;dts;5.1(si;768 kb/s;aud655;demux;-acodec copy;dts,Stream-5
wird
0:0;[0x1e0];Video;mpeg2;720x576;;vid211;normal;-vcodec copy;mp4;SAR 64:45 DAR 16:9,Stream-0
1:0;[0x84];Audio;ac3;stereo;224 kb/s;aud511;demux;-acodec copy;ac3,Stream-1;en
2:0;[0x83];Audio;ac3;stereo;224 kb/s;aud522;demux;-acodec copy;ac3,Stream-2;en
3:0;[0x82];Audio;ac3;5.1(si;448 kb/s;aud633;demux;-acodec copy;ac3,Stream-3;en
4:0;[0x80];Audio;ac3;5.1(si;448 kb/s;aud644;demux;-acodec copy;ac3,Stream-4;de
5:0;[0x89];Audio;dts;5.1(si;768 kb/s;aud655;demux;-acodec copy;dts,Stream-5;de

Gruß
Friemler
max5moritz
max5moritz 03.02.2013 aktualisiert um 20:24:07 Uhr
Goto Top
Dank an @Friemler für die schnelle Antwort.

Ergebnis ist so, wie es gedacht ist.

Eine Frage zur 36. Zeile:
Wird das OutFile onBlock oder Zeileweise beschrieben / gefüllt?
 > "%OutFile%"  
Damit legt man/frau diese Datei immer wieder neu an. Wie kommen dennoch alle Zeilen an?

Danke für die Hilfe

Gruß
max5moritz
Friemler
Friemler 03.02.2013 um 20:34:46 Uhr
Goto Top
Hallo max5moritz,

Zitat von @max5moritz:
Damit legt man/frau diese Datei immer wieder neu an. Wie kommen dennoch alle Zeilen an?

die Datei wird nur einmal geöffnet und bleibt während des kompletten Laufs der äußeren FOR-Schleife (Zeile 8 bis 36) offen. Deshalb muss ich keinen Append-Operator >> verwenden und der ganze Scriptlauf wird dadurch stark beschleunigt. Bei sehr großen Ausgabedateien kann der Zeitbedarf von mehreren Minuten auf wenige Sekunden schrumpfen.

Bedingung ist, dass die komplette FOR-Schleife in Klammern eingeschlossen ist und die Ausgabeumleitung außerhalb dieses Klammerblocks notiert wird.

Gruß
Friemler
rubberman
rubberman 03.02.2013 um 20:39:02 Uhr
Goto Top
Hallo Zusammen,

bin spät dran. Aber alternativ (und mit den gewünschten Variablen) ggf auch so:
@echo off &setlocal EnableDelayedExpansion
set "file1=datei1.txt"  
set "file2=datei2.txt"  
set "fileout=datei3.txt"  

>"%fileout%" (  
  for /f usebackq^ delims^=^ eol^= %%a in ("%file2%") do (  
    for /f delims^=^;^ tokens^=2^,3^,7^ eol^= %%b in ("%%a") do (  
      if /i "%%c"=="Audio" (  
        set /a n=%%b
        for /f tokens^=5^ delims^=^;^ eol^= %%e in ('findstr /ix "Audio;..*;!n!;" "%file1%"') do (  
          echo %%a;%%e
          set "%%d=%%e"  
        )
      ) else (
        echo %%a
      )
    )
  )
)

echo Variablen:
set aud
pause
Grüße
rubberman
max5moritz
max5moritz 03.02.2013 um 22:01:29 Uhr
Goto Top
Danke @rubberman für die Mithilfe,

ich werde es ausprobieren und mich dann melden, welche der beiden Lösungen mir besser gefällt.
Optisch sieht es zumindest schon einmal interessant aus. Und ich bin ein Stück weiter.

so long and goodnight,
max5moritz
max5moritz
max5moritz 03.02.2013 um 22:05:17 Uhr
Goto Top
Danke @Friemler für die Erläuterung. Mich hatte die Eröffungsklammer tatsächlich schon etwas stutzig gemacht. In notepad++ sieht man es ja sehr schön, welche Klammer wohin gehört. Daher ahnte ich schon etwas, doch es zu wissen ist immer besser.

Gruß
max5moritz