Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: max5moritz

max5moritz (Level 1) - Jetzt verbinden

03.02.2013, aktualisiert 17:42 Uhr, 2061 Aufrufe, 10 Kommentare

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:

01.
Video;1;5750;0;;;MPEG2;720x576;3;25;.=; 
02.
Audio;1;5750;0;de;5;ac3;5.1;;;128; 
03.
Audio;1;5750;1;de;5;dts;5.1/6.1;;;137; 
04.
Audio;1;5750;2;en;5;ac3;5.1;;;130; 
05.
Audio;1;5750;3;en;5;ac3;stereo;;;131; 
06.
Audio;1;5750;4;en;5;ac3;stereo;;;132; 
07.
Subti;1;5750;1;de;2;;;;;; 
08.
Subti;1;5750;3;de;2;;;;;;
2. Datei, aufbereitet aus den Infos von ffmpeg:
01.
0:0;[0x1e0];Video;mpeg2;720x576;;vid211;normal;-vcodec copy;mp4;SAR 64:45 DAR 16:9,Stream-0   
02.
1:0;[0x84];Audio;ac3;stereo;224 kb/s;aud511;demux;-acodec copy;ac3,Stream-1  
03.
2:0;[0x83];Audio;ac3;stereo;224 kb/s;aud522;demux;-acodec copy;ac3,Stream-2  
04.
3:0;[0x82];Audio;ac3;5.1(si;448 kb/s;aud633;demux;-acodec copy;ac3,Stream-3  
05.
4:0;[0x80];Audio;ac3;5.1(si;448 kb/s;aud644;demux;-acodec copy;ac3,Stream-4  
06.
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
Mitglied: rubberman
03.02.2013 um 18:11 Uhr
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
Bitte warten ..
Mitglied: max5moritz
03.02.2013, aktualisiert um 19:12 Uhr
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
01.
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
Bitte warten ..
Mitglied: rubberman
03.02.2013, aktualisiert um 19:08 Uhr
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
Bitte warten ..
Mitglied: max5moritz
03.02.2013, aktualisiert um 19:20 Uhr
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
Bitte warten ..
Mitglied: Friemler
03.02.2013, aktualisiert um 20:02 Uhr
Hallo max5moritz,

teste mal folgendes:
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set "InFile1=.\Datei1.txt" 
04.
set "InFile2=.\Datei2.txt" 
05.
set "OutFile=.\Out.txt" 
06.
 
07.
 
08.
(for /f "usebackq eol=° delims=" %%a in ("%InFile2%") do ( 
09.
   set "Line2=%%a" 
10.
   set "Type2=" 
11.
   set "Num2=" 
12.
 
13.
   for /f "eol=° tokens=2,3 delims=[];" %%b in ("!Line2!") do ( 
14.
     set /a Num2=%%b 
15.
     set "Type2=%%c" 
16.
17.
 
18.
   for /f "usebackq eol=° delims=" %%c in ("%InFile1%") do ( 
19.
     set "Line1=%%c" 
20.
     set "Type1=" 
21.
     set "Lang=" 
22.
     set "Num1=" 
23.
     set /a Cntr=1 
24.
 
25.
     for %%d in ("!Line1:;=","!") do ( 
26.
       if !Cntr! equ 1  (if "%%~d" neq "" (2>NUL set "Type1=%%~d")) 
27.
       if !Cntr! equ 5  (if "%%~d" neq "" (2>NUL set "Lang=%%~d")) 
28.
       if !Cntr! equ 11 (if "%%~d" neq "" (2>NUL set /a Num1=%%~d)) 
29.
       set /a Cntr+=1 
30.
31.
 
32.
     if "!Num1!" neq "" if !Num1! equ !Num2! if "!Type1!" equ "!Type2!" set "Line2=!Line2!;!Lang!" 
33.
34.
 
35.
   <NUL set /p "=!Line2!" & echo. 
36.
)) > "%OutFile%"
Aus
01.
0:0;[0x1e0];Video;mpeg2;720x576;;vid211;normal;-vcodec copy;mp4;SAR 64:45 DAR 16:9,Stream-0 
02.
1:0;[0x84];Audio;ac3;stereo;224 kb/s;aud511;demux;-acodec copy;ac3,Stream-1 
03.
2:0;[0x83];Audio;ac3;stereo;224 kb/s;aud522;demux;-acodec copy;ac3,Stream-2 
04.
3:0;[0x82];Audio;ac3;5.1(si;448 kb/s;aud633;demux;-acodec copy;ac3,Stream-3 
05.
4:0;[0x80];Audio;ac3;5.1(si;448 kb/s;aud644;demux;-acodec copy;ac3,Stream-4 
06.
5:0;[0x89];Audio;dts;5.1(si;768 kb/s;aud655;demux;-acodec copy;dts,Stream-5
wird
01.
0:0;[0x1e0];Video;mpeg2;720x576;;vid211;normal;-vcodec copy;mp4;SAR 64:45 DAR 16:9,Stream-0 
02.
1:0;[0x84];Audio;ac3;stereo;224 kb/s;aud511;demux;-acodec copy;ac3,Stream-1;en 
03.
2:0;[0x83];Audio;ac3;stereo;224 kb/s;aud522;demux;-acodec copy;ac3,Stream-2;en 
04.
3:0;[0x82];Audio;ac3;5.1(si;448 kb/s;aud633;demux;-acodec copy;ac3,Stream-3;en 
05.
4:0;[0x80];Audio;ac3;5.1(si;448 kb/s;aud644;demux;-acodec copy;ac3,Stream-4;de 
06.
5:0;[0x89];Audio;dts;5.1(si;768 kb/s;aud655;demux;-acodec copy;dts,Stream-5;de
Gruß
Friemler
Bitte warten ..
Mitglied: max5moritz
03.02.2013, aktualisiert um 20:24 Uhr
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?
01.
 > "%OutFile%"
Damit legt man/frau diese Datei immer wieder neu an. Wie kommen dennoch alle Zeilen an?

Danke für die Hilfe

Gruß
max5moritz
Bitte warten ..
Mitglied: Friemler
03.02.2013 um 20:34 Uhr
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
Bitte warten ..
Mitglied: rubberman
03.02.2013 um 20:39 Uhr
Hallo Zusammen,

bin spät dran. Aber alternativ (und mit den gewünschten Variablen) ggf auch so:
01.
@echo off &setlocal EnableDelayedExpansion 
02.
set "file1=datei1.txt" 
03.
set "file2=datei2.txt" 
04.
set "fileout=datei3.txt" 
05.
 
06.
>"%fileout%" ( 
07.
  for /f usebackq^ delims^=^ eol^= %%a in ("%file2%") do ( 
08.
    for /f delims^=^;[]^ tokens^=2^,3^,7^ eol^= %%b in ("%%a") do ( 
09.
      if /i "%%c"=="Audio" ( 
10.
        set /a n=%%b 
11.
        for /f tokens^=5^ delims^=^;^ eol^= %%e in ('findstr /ix "Audio;..*;!n!;" "%file1%"') do ( 
12.
          echo %%a;%%e 
13.
          set "%%d=%%e" 
14.
15.
      ) else ( 
16.
        echo %%a 
17.
18.
19.
20.
21.
 
22.
echo Variablen: 
23.
set aud 
24.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: max5moritz
03.02.2013 um 22:01 Uhr
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
Bitte warten ..
Mitglied: max5moritz
03.02.2013 um 22:05 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...