Kompressionsrate berechnen
Zwei Dateien sollten anhand ihrer Dateigröße so verglichen werden, dass damit die Kompressionsrate ausgerechnet werden kann. Die Kompressionsrate gibt das Verhältnis von komprimierter und ursprünglicher Datei an.
Hallo zusammen!
Wie kann ich die Kompressionsrate ausrechnen? Ich weiß wie ich die Dateigröße herausbekomme und ausgeben kann. Wie mache ich das jetzt aber alles in einer Ausgabezeile? Eine FOR- in einer FOR-Schleife (geschachtelt) macht ja nicht das richtige, da alle Dateien dann ausgegeben werden. Zwei "Parameter" in einer FOR-Schleife gehen auch nicht, oder?
Hier mal mein Code:
Also es soll folgendes können:
-Kompressionsrate pro Datei
-durchschnittliche Kompressionsrate am Ende
Zu "Kompressionsrate pro Datei":
Wie setze ich zwei Dateien ins Verhältnis? Also bball.bmp & bball.zip?
Zu "durchschnittliche Kompressionsrate am Ende":
Theoretisch müsste ich zwei Variablen mitführen. Eine als Summe und die andere als Anzahl. Am Ende mache ich dann eine Division und gebe das Ergebnis aus.
[EDIT]
Hier mein erster Ansatz mit oben genannten Problem, dass ich keine zwei IN darin haben darf bzw. %%i und %%j:
[/EDIT]
Ich würde mich auf eine Hilftestellung freuen!
LG
anve
Hallo zusammen!
Wie kann ich die Kompressionsrate ausrechnen? Ich weiß wie ich die Dateigröße herausbekomme und ausgeben kann. Wie mache ich das jetzt aber alles in einer Ausgabezeile? Eine FOR- in einer FOR-Schleife (geschachtelt) macht ja nicht das richtige, da alle Dateien dann ausgegeben werden. Zwei "Parameter" in einer FOR-Schleife gehen auch nicht, oder?
Hier mal mein Code:
@echo off
REM Kompressionsrate berechnen
echo ////////////////////////////////
set "tab= "
set origpath=C:\temp\test\*.bmp
set comppath=C:\temp\test\*.zip
echo Ursprungsdateien: %origpath%
echo Komprimierte Datein: %comppath%
echo.
echo Datei %tab% Urspr. Groesse %tab% Kompr. Groesse %tab% k-Faktor
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do (
Echo %%~nixi %tab% %%~zi
)
echo ////////////////////////////////
Also es soll folgendes können:
-Kompressionsrate pro Datei
-durchschnittliche Kompressionsrate am Ende
Zu "Kompressionsrate pro Datei":
Wie setze ich zwei Dateien ins Verhältnis? Also bball.bmp & bball.zip?
Zu "durchschnittliche Kompressionsrate am Ende":
Theoretisch müsste ich zwei Variablen mitführen. Eine als Summe und die andere als Anzahl. Am Ende mache ich dann eine Division und gebe das Ergebnis aus.
[EDIT]
Hier mein erster Ansatz mit oben genannten Problem, dass ich keine zwei IN darin haben darf bzw. %%i und %%j:
@echo off
set path=C:\temp\
set origpath=C:\temp\test\*.bmp
set comppath=C:\temp\test\*.zip
if EXIST "%path%orig.txt" del "%path%orig.txt"
if EXIST "%path%comp.txt" del "%path%comp.txt"
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do (
Echo %%~zi>>orig.txt
)
for /f "delims=" %%i in ('dir /b /s "%comppath%"') do (
Echo %%~zi>>comp.txt
)
set sum=0
set anz=0
for /f "delims=" %%i %%j in ("%path%orig.txt") in ("%path%comp.txt") do (
set orig=%%~zi;
set comp=%%~zj;
set /a erg=comp/orig
echo K-Faktor %erg% %
set /a sum=sum+erg
set /a anz+=1
)
set /a avg=sum/anz
echo Durchschnitt: %avg%
Ich würde mich auf eine Hilftestellung freuen!
LG
anve
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 102749
Url: https://administrator.de/contentid/102749
Ausgedruckt am: 17.11.2024 um 17:11 Uhr
16 Kommentare
Neuester Kommentar
Skizze:
Den Faktor 100 habe ich eingebaut, weil man meines Wissens mit Batch nichts so leicht mit Kommas rechnen kann. Wenn du also 1:kfac haben willst, dann musst du die Zahlen noch durch 100 teilen. Das sollte aber kein Problem sein.
@echo off
REM Kompressionsrate berechnen
echo ////////////////////////////////
set "tab= "
set origpath=C:\temp\test\*.bmp
set comppath=C:\temp\test\*.zip
set "compPathFile=C:\temp\test"
echo Ursprungsdateien: %origpath%
echo Komprimierte Datein: %comppath%
echo.
echo Datei %tab% Urspr. Groesse %tab% Kompr. Groesse %tab% k-Faktor
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do (
for /f "delims=" %%j in ('dir /b /s "%comppath%\%%~ni.zip"') do (
set "file=%%~ni%%~xi"
set /a orgsize=%%~zi
set /a comsize=%%~zj
set /a kfac=%%~zi*100/%%~zj
)
call :ausgabe
)
echo ////////////////////////////////
goto :eof
:ausgabe
Echo %file% %tab% %orgsize% %tab% %comsize% %tab% 100: %kfac%
goto :eof
Ich gehe mal davon aus das es für jede orginal bmp Datei eine zip Datei im gleichen Verzeichnis mit dem gleichen Namen gibt (ungetestet):
Du könntest allerdings Probleme mit nachkommastellen bekommen.
@echo off
REM Kompressionsrate berechnen
echo ////////////////////////////////
set "tab= "
set origpath=C:\temp\test\*.bmp
set comppath=C:\temp\test\*.zip
echo Ursprungsdateien: %origpath%
echo Komprimierte Datein: %comppath%
echo.
echo Datei %tab% Urspr. Groesse %tab% Kompr. Groesse %tab% k-Faktor
set anzahl=0
set rate=0
set rateall=0
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do (
for /f "tokens=3 delims= " %%a in ('dir /-c "%%~ni.bmp"^|find "%%~ni.bmp"') do set orgsize=%%a
for /f "tokens=3 delims= " %%a in ('dir /-c "%%~ni.zip"^|find "%%~ni.zip"') do set kompsize=%%a
call verarbeite "%%~ni" %orgsize% %kompsize%
)
set /a rate=%rateall%/%anzahl%
echo durchschnittliche Kompressionsrate: %rate%
echo ////////////////////////////////
goto:eof
:verarbeite
set /a anzahl=%anzahl%+1
set /a rate=%orgsizeall%/%kompsizeall%
set /a rateall=%rateall%+%rate%
echo %1: %tab% %2 %rate%
Du könntest allerdings Probleme mit nachkommastellen bekommen.
Die zwei For-Schleifen sind eigentlich gar keine. Er sucht sich die zip-Datei, mit dem gleichen Namen, wie die Ursprungsdatei. Davon gibt es nur eine. Das nutze ich nur, damit ich von der Zip-Datei auch die Größe bekomme. Das geht vielleicht auch eleganter, kA.
Die zweite Zeile scheint für mich der Modulo-Operator zu sein. Damit bekommst du den Rest der Division von Dauer durch 100. So ergibt es aber für mich gerade keinen Sinn:
Die zweite Zeile scheint für mich der Modulo-Operator zu sein. Damit bekommst du den Rest der Division von Dauer durch 100. So ergibt es aber für mich gerade keinen Sinn:
set /a vorkomma=%size%/100
set /a nachkomma=%size% %% 100
echo Größe: %vorkomma%,%nachkomma%
Natürlich gibt es einen Möglichkeit, aber das wird aufwändig: Hier kannst du mal gucken, wie man die Länge einer Variable bekommst:
suche sowas wie get.length um eine bestimmte zeilenlaenge einer Batch-Datei auszulesen...
wenn du die hast, dann kannst du die Tabs durch eine errechnete Anzahl an Leertasten ersetzten. Das geht, aber für mich würde es den Aufwand und die Performance nicht aufwiegen, dann habe ich es lieber hässlich.
suche sowas wie get.length um eine bestimmte zeilenlaenge einer Batch-Datei auszulesen...
wenn du die hast, dann kannst du die Tabs durch eine errechnete Anzahl an Leertasten ersetzten. Das geht, aber für mich würde es den Aufwand und die Performance nicht aufwiegen, dann habe ich es lieber hässlich.
Hallo anve und Ren!
Eine zwar nicht optimale, aber vielleicht doch akzeptable Lösung für die übersichtliche(re) Ausgabe könnte darin bestehen, manuell eine ausreichende Anzahl von Leerzeichen anzufügen und dann die gewünschten Teile mit einer fixen Spaltenbreite "abzuschneiden" - für den Dateinamen etwa:
Bei der Ausgabe dann einfach
Analog für die Größenangaben (da ohnehin nicht mit den Variablen gerechnet wird, können diese ohne "/a", aber mit einigen Leerzeichen festgelegt werden):
Ausgabe mit 9 Stellen (rechtsbündig):
Grüße
bastla
Eine zwar nicht optimale, aber vielleicht doch akzeptable Lösung für die übersichtliche(re) Ausgabe könnte darin bestehen, manuell eine ausreichende Anzahl von Leerzeichen anzufügen und dann die gewünschten Teile mit einer fixen Spaltenbreite "abzuschneiden" - für den Dateinamen etwa:
set "file=%%~nxi "
echo %file:~,30%
set "orgsize= %%~zi"
echo %orgsize:~-9%
bastla
Hm, sollte eigentlich egal sein. Offiziell sind Kommentare in Batch Zeilen hinter einem REM. Mit :: nutzt man aus, dass :: Text einen fehlerhafte Sprungzieladresse ist. Das wirkt dann sozusagen als Kommentar. Der einzige mir bekannte Unterschied ist, dass man, wenn man echo on schaltet, die Rem-Zeilen ausgegeben bekommt, während die :: nicht angesprungen werden, also auch nicht erscheinen.
Dass er find bei dir nicht findet, finde ich auch suspekt. Find ist ein externe Befehl, die Datei sollte in %windir%\system32\find.exe zu finden sein, und das sollte im Pfad sein. Wenn nicht, ist in meinen Augen etwas nicht in Ordnung, es sei denn, unter Windows Vista oder seven oder weiß der Geier hat man find.exe weggelassen.
Dass er find bei dir nicht findet, finde ich auch suspekt. Find ist ein externe Befehl, die Datei sollte in %windir%\system32\find.exe zu finden sein, und das sollte im Pfad sein. Wenn nicht, ist in meinen Augen etwas nicht in Ordnung, es sei denn, unter Windows Vista oder seven oder weiß der Geier hat man find.exe weggelassen.