bobbel323
Goto Top

Zahlen aus einer Datei auslesen und mit Batch addieren

Zuerst möchte ich mich schon mal im vorraus bei allen bedanken die mir helfen das Problem zu lösen.

Hallo zusammen,

ich habe mir eine Batch gebastelt um Daten aus meinen Logfiles rauszufiltern. Nun stehe ich aber vor einem Problem das ich alleine nicht lösen kann.
Meine Batch Datei soll anhand eines FOR Befehls (denke das ist das Beste) aus einem Logfile Zahlen rausfiltern (stehen in jeder Zeile an der selben Position, sollte also mit tokens=... gehen) und diese dann addieren. Das Ergebnis soll dann in eine Datei geschrieben werden. Die Zahlen haben kein Komma !

Einige werden sagen, nimm doch VBS ! Aber nein, ich bin der Meinung das muss auch mit DOS gehen.

Freue mich über eure Beiträge.

Vielen Dank.

Content-ID: 117543

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

holzholer
holzholer 05.06.2009 um 11:01:23 Uhr
Goto Top
Hallo,

mit SET /A kann man zahlen in Variablen speichern und dann auch damit rechnen. Weitere Infos hierzu findest du mit SET /? und natürlich in der Suche hier im Forum.

Grüße
bastla
bastla 05.06.2009 um 11:02:31 Uhr
Goto Top
Hallo Bobbel323 und willkommen im Forum!

Da die Beschreibung Deines Logfiles etwas sparsam ausgefallen ist, musst Du die "for"-Schleife eben selbst anpassen:
@echo off & setlocal
set /a Summe=0

for /f "tokens=2 delims=," %%i in (D:\Logfile.log) do set /a Summe+=%%i  
>D:\Ergebnis.txt echo %Summe%
Grüße
bastla
TWAWLW
TWAWLW 05.06.2009 um 11:04:09 Uhr
Goto Top
Hi,

Sollte mit set /a gehen. Les doch mal hier:

http://de.wikibooks.org/wiki/Batch-Programmierung:_Programmierungshilfe ...

Viel Erfolg,
TWAWLW

PS: Hoppla, da war wohl einer schneller ...
Bobbel323
Bobbel323 05.06.2009 um 13:21:24 Uhr
Goto Top
Hallo und danke für die Tips:

@bastla:

Hier ein Teil meines Test.Scripts:


echo Enter a logfile name followed by CRTL+Z to start:
copy con filename.tmp
echo.
echo DONE

REM #Copy user interaction to var FILENAME
for /f "delims=~" %%i in (filename.tmp) do set FILENAME=%%i

REM #Creating variables
set "Datei=sort.txt"
set "Bak=.bak"
set /a LineNo=0
set /a Summe=0

for /f "usebackq skip=1 tokens=2" %%i in ("%FILENAME%") do set /a Summe+=%%i >> %FILENAME%_summary.txt echo %Summe%

Ergebnis:
D:\>set /a Summe+=54870865 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=136935065 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=327903 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=55483411 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=139899871 echo 0 1>>D:\ABCID-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=134457 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=137028631 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=54628156 echo 0 1>>D:\ABCI-D-Tapes-05.txt_summary.txt
Missing operator.

Mein Texfile sieht in etwa so aus:
"Tape" "Data Size in Kilobytes" "Last Time Written Unix Time"
ABCI 534 135403085 1241132402
ABCI 539 54894796 1241136062


Wobei mich nur die Zahl im im 2.Feld interessiert.
bastla
bastla 05.06.2009 um 15:41:48 Uhr
Goto Top
Hallo Bobbel323!

Das Ergebnis kannst Du erst nach Ende der Schleife schreiben, daher etwa so:
@echo off & setlocal
set "FILENAME="  
set /p FILENAME=Enter a logfile name to start:
if not defined FILENAME (echo Keine Logdatei angegeben! & goto :eof)

REM #Creating variables
set "Datei=sort.txt"  
set "Bak=.bak"  
set /a LineNo=0
set /a Summe=0

for /f "usebackq skip=1 tokens=2" %%i in ("%FILENAME%") do set /a Summe+=%%i  
>%FILENAME%_summary.txt echo %Summe%
Noch eine Anmerkung: Da es sich um relativ hohe Zahlenwerte handelt, wirst Du früher oder später an die Genauigkeitsgrenze der Berechnungen in CMD stoßen - (positive) Zahlen über 2147483647 (2^31 - 1) kannst Du per CMD-Artihmetik mit "set /a" nicht verarbeiten ...

Grüße
bastla

[Edit] Prüfung auf "leere" Eingabe des Dateinamens hinzugefügt [/Edit]
Bobbel323
Bobbel323 05.06.2009 um 16:04:24 Uhr
Goto Top
Hallo Bastla,

vielen Dank für deine Hilfe, allerdings verstehe ich hier etwas nicht so ganz.

Wenn ich deine Batch so ausführe dann bekomme ich weiterhin den Missing Operator Fehler

D:\>for /F "usebackq skip=1 tokens=2" %i in ("D:\GIS-D-Tapes-05.txt") do set /a

D:\>set /a Summe+=135403085 echo 0 1>D:\GIS-D-Tapes-05.txt_summary.txt
Missing operator.

D:\>set /a Summe+=54894796 echo 0 1>D:\GIS-D-Tapes-05.txt_summary.txt
Missing operator.

usw.

Was mache ich hier falsch ?

Danke und viele Grüße
bastla
bastla 05.06.2009 um 16:11:20 Uhr
Goto Top
Hallo Bobbel323!

Wenn Du oberhalb des Batch-Listings auf "Quelltext" klickst, kannst Du den von mir geposteten Code (fast - am Ende jeder Zeile hängt gern mal ein zusätzliches Leerzeichen) 1:1kopieren - dann sollte es auch nicht passieren, dass die Zeile 10 und 11 (bzw jetzt neu Zeilen 12 und 13) zu einer einzigen Zeile werden ...
Ich habe oben noch zwei kleine Details eingearbeitet (die allerdings nichts mit dem von Dir angesprochenen Problem zu tun haben).

Grüße
bastla
Bobbel323
Bobbel323 08.06.2009 um 11:17:00 Uhr
Goto Top
Hallo Bastla,

vielen Dank für deine Hilfe, funktioniert jetzt alles bestens.

Leider bin ich jetzt an der von dir erwähnten Problematik angelangt:

(positive) Zahlen über 2147483647 (2^31 - 1) kannst Du per CMD-Artihmetik mit "set /a" nicht verarbeiten ...

Muss also etwas umdenken und evtl. doch noch etwas mit VB arbeiten face-sad

Grüße
bastla
bastla 08.06.2009 um 20:31:00 Uhr
Goto Top
Hallo Bobbel323!

Sofern Du mit etwas Ungenauigkeit leben kannst, wäre etwa folgende Vorgangsweise möglich:
for /f "usebackq skip=1 tokens=2" %%i in ("%FILENAME%") do set /a Summe+=%%i/1024
Bei der Division erhältst Du als Ergebnis immer nur den ganzzahligen Anteil, die Reste fallen unter den Tisch ...

Grüße
bastla

P.S.: Was ist so schlimm an VB(S)?
Landstreicher
Landstreicher 19.01.2012 um 11:50:20 Uhr
Goto Top
Ich weiss, das Thema ist alt ... aber schaut mal was passiert wenn man eine zu große Zahl setzt ...

D:\>set /a summe=2147483647
2147483647
D:\>set /a summe=2147483648
-2147483648

genau, es wird negativ und damit funktioniert die "Rechnung" nicht mehr ...

jemand eine Lösung parat ?

gruß Landstreicher
bastla
bastla 19.01.2012 um 12:31:30 Uhr
Goto Top
Hallo Landstreicher!
jemand eine Lösung parat ?
In der CMD-Shell sind direkte Berechnungen nur mit Werten zwischen -2^31 und +2^31-1 möglich - daher ggf auf eine andere Sprache (zB VBS) ausweichen ...

Grüße
bastla