realdaveger
Goto Top

Batch vergleich von zwei dateien

Hallo,

nach Jahrelangem zugucken, habe ich jetzt schlussendlich eine Frage welche ich selbst stelle.

Ich versuche 2 zeiten aus 2 dateien miteinander zu vergleichen und wenn die "alte" zeit geringer ist als die "neue", soll die alte ersetzt werden.

Leider stehe ich jetzt ein bisschen im Wald, wenn man Stundenlang nach einer Lösung sucht, sieht man evtl. die einfacheren Möglichkeiten nicht. Daher wäre super wenn mir jemand dabei helfen könnte. Was ich bisher habe:

for /f %%A in ('dir /s /b timings\*.new') do (   
	for /f "tokens=1,2,3 delims= " %%r in (%%A) do (  
		echo %%r:%%s:%%t > %%A
	)
	for /f %%r in (%%A) do (
		set inp=%%A
		set raw=%inp:~0,-3%
		set tnew=%%r
		if exist %raw%txt ( 
			set told= <%raw%txt
			) 
		if not exist %raw%txt ( 
			set told=99.99.999
			)
		if "%tnew%" LSS "%told%" echo %tnew% > %raw%txt  
	)
)

Der erste abschnitt bereitet die Zeiten nur wie folgt auf:

2 16 543 zu 2:16:543

Das ganze soll in einer for schleife, denn es sollen einige hundert Dateipaare verglichen werden.

folgender Output wird generiert:

set inp=C:\test\logtest\timings\nurburgring\ruf_yellowbird\RealDaveGER.new
 set raw=C:\test\logtest\timings\nurburgring\ruf_yellowbird\RealDaveGER.
 set tnew=2:19:654
 if exist C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt (
set told=  0<C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt )
 if not exist C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt (set told=99.99.999 )
 if "2:19:654" LSS "99.99.999" echo 2:19:654  1>C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt  
)
2:19:654

Wie es aussieht komme ich mit den set raw nicht zurecht, dort wird es nicht mitgenommen.

Danke euch,

BTW schöne community hier!

Gruß Dave

Content-Key: 261023

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

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: rubberman
rubberman 24.01.2015 aktualisiert um 16:22:35 Uhr
Goto Top
Hallo Dave, willkommen im Forum.

Ich denke du hast 2 Probleme.
  1. Variablen werden innerhalb einer Kommandozeile oder eines (in Klammern eingefassten) Blocks von Kommandozeilen nur einmal zum Wert aufgelöst. Abhilfe schafft die verzögerte Variablenerweiterung (setlocal EnableDelayedExpansion).
  2. Da du Punkte zwischen deinen Zahlen setzt, wird alphanumerisch verglichen. Ohne vorangestellte 0 bei einstelligen Stunden, ist das Ergebnis nicht das, das du erwartest. (2.12.123 ist größer als 10.12.123, da 2 größer als 1 ist)

Um dir helfen zu können, wäre es besser du würdest mal beispielhaft den Inhalt einer deiner *.new Dateien posten.

Grüße
rubberman
Mitglied: realdaveger
realdaveger 24.01.2015 aktualisiert um 18:15:29 Uhr
Goto Top
ähmm ok, evtl. nicht gleich ersichtlich:

aus bsp. 2 15 547

wird hier:

for /f %%A in ('dir /s /b timings\*.new') do (    
	for /f "tokens=1,2,3 delims= " %%r in (%%A) do (   
	echo %%r:%%s:%%t > %%A

2:15:547

dies ist der einzige Inhalt

zum anderen Punkt, wenn ich folgendes teste:

if "2:19:654" LSS "99.99.999" echo true  

dann wird meines erachtens richtig verglichen.

edit: problem erkannt, du hast recht!

setlocal ist in der batch mit aufgeführt, das hatte ich vergessen zu erwähnen. Leider bringt "EnableDelayedExpansion" keine Veränderung.

Gruß
Mitglied: rubberman
rubberman 24.01.2015 um 18:20:58 Uhr
Goto Top
Hallo Dave.

2 15 547
Ah, OK. Wenn das Beispiel 15 mal einstellig ist, hast du dann eine vorangestellte 0? Also bspw. 9 oder 09?

dann wird meines erachtens richtig verglichen.
Oh, das ist ja noch schlimmer (hatte ich gar nicht gesehen). Punkt und Doppelpunk sind nicht die gleichen Zeichen in einem Vergleich.

Leider bringt "EnableDelayedExpansion" keine Veränderung.
Doch, doch. Die Syntax für Variablen ändert sich aber gleichzeitig. Aus den umschließenden Prozentzeichen müssen umschließende Ausrufezeichen werden.

Egal. Beantworte erst mal die erste Frage. Wahrscheinlich kann man sich die verzögerte Erweiterung sowieso sparen.

Grüße
rubberman
Mitglied: rubberman
Lösung rubberman 24.01.2015, aktualisiert am 26.01.2015 um 14:00:01 Uhr
Goto Top
OK, hab mal fix was zusammen geschrieben, was unabhängig davon immer funktionieren sollte.
@echo off &setlocal

set /a "current_num = 0, smallest_num = 9999999"  
set "file="  
for /f "delims=" %%i in ('dir /a-d /b /s "timings\*.new"') do (  
  for /f "usebackq tokens=1-3" %%j in ("%%~i") do (  
    set /a "current_num = 100000 * (100%%j %% 100) + 1000 * (100%%k %% 100) + 1000%%l %% 1000"  
    setlocal EnableDelayedExpansion
    echo !current_num! kleiner als !smallest_num! ?
    if !current_num! lss !smallest_num! (
      endlocal
      set /a "smallest_num = current_num"  
      set "file=%%~i"  
    ) else endlocal
  )
)

echo Datei mit der kleinsten Nummernfolge:
echo "%file%"  
pause

Grüße
rubberman
Mitglied: realdaveger
realdaveger 26.01.2015 um 11:25:00 Uhr
Goto Top
Danke schon einmal vorab für die Hilfe,

mit Punkt und Doppelpunkt, hatte ich nur vergessen die shift taste zu drücken...

Grundsätzlich kann das erst einmal außer Betracht gelassen werden. Die Zeiten sehen wie folgt aus:

2 15 547 | ohne punkt oder doppelpunkt. Die 3 Tokens werden ja von deinem Script schon richtig verglichen. Das letzte Problem was halt besteht ist, das natürlich in der kompletten Struktur durchsucht wird und die niedrigste Zeit ausgegeben wird.

Es muss unterschieden werden in "Track\auto\fahrer\bestzeit.txt(/new)" -> so ist auch die ordnerstruktur aufgebaut. Neue Zeiten kommen in die Datei:

"x:\Track\auto\fahrer\bestzeit.new" und diese Zeit soll verglichen werden (wenn vorhanden) mit der bestehenden "x:\Track\auto\fahrer\bestzeit.txt", wenn die neue Zeit kleiner ist als die vorhandene, dann soll er diese überschreiben.

Mein Verständisproblem besteht darin, wie ich mit der ersten for Schleife die vorhandene Zeit auslesen kann.

Mein Ansatz wäre halt gewesen die erste Variable zu missbrauchen, indem die letzten 3 Zeichen abgeschnitten werden und neu gesetzt werden.

set inp=%%A
set old=%inp:~0,-3%

Ich versuche mal weiter...

Grüße
Mitglied: realdaveger
realdaveger 26.01.2015 um 13:59:52 Uhr
Goto Top
Ok ich habs hinbekommen.

Einmal für die Nachwelt:

for /f %%A in ('dir /s /b timings\*.new') do (  
	SETLOCAL ENABLEDELAYEDEXPANSION
	set dat=
	set old=
	set told=
	set tnew=
	set tnewraw=
	set dat=%%A
	set old=!dat:~0,-3!txt
	if exist "!old!" for /f "tokens=1,2,3 delims= " %%f in ('type "!old!"') do set told=%%f%%g%%h  
	if not exist "!old!" set told=9999999  
	for /f "tokens=1,2,3 delims= " %%i in ('type "%%A"') do (  
		set tnew=%%i%%j%%k
		set tnewraw=%%i %%j %%k
	)
	if !tnew! LSS !told! echo !tnewraw! > "!old!"  
	
	endlocal
)

Danke nochmal an dich, Radiergummimann