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:
2. Datei, aufbereitet aus den Infos von ffmpeg:
Nein, die Infos stammen von der selben Input-Datei. Es erkennt halt jeder was für wichtig hält
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 201195
Url: https://administrator.de/contentid/201195
Ausgedruckt am: 21.11.2024 um 16:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo max5moritz.
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
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.
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
Hallo max5moritz.
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
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
Hallo max5moritz,
teste mal folgendes:
Aus
wird
Gruß
Friemler
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
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
Hallo max5moritz,
die Datei wird nur einmal geöffnet und bleibt während des kompletten Laufs der äußeren
Bedingung ist, dass die komplette
Gruß
Friemler
Zitat von @max5moritz:
Damit legt man/frau diese Datei immer wieder neu an. Wie kommen dennoch alle Zeilen an?
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
Hallo Zusammen,
bin spät dran. Aber alternativ (und mit den gewünschten Variablen) ggf auch so:
Grüße
rubberman
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
rubberman