Benötige Batch File, dass Nummern in einer txt-Datei durch 1000 teilt

Klendathu

Cadet 3rd Year
Dabei seit
März 2017
Beiträge
45
Hallo,

Ich weiß, ich habe in letzter Zeit schon einige male nach Hilfe bei Batchdateien gefragt, aber hier kommt doch noch eine^^

Ich möchte Nummern in einer Text Datei '(Input.txt) alle durch 1000 teilen lassen und sie dann in Output.txt speichern lassen.

Das wäre es auch schon^^

Bin für jede Hilfe dankbar :-)

Lg Klen!

Mein bisheriger Versuch: (der nicht funktioniert)

setlocal ENABLEDELAYEDEXPANSION

for /F "tokens=*" %%B in (input.txt)

do for /F "tokens=*" %%A in (output.txt)

set /a %%A=%%B / %num2%
 

Andreas_

Commander
Dabei seit
Jan. 2017
Beiträge
2.172
Wie sind denn die Nummern in der imput.txt enthalten? Eine Nummer pro Zeile? Oder sind da noch andere Informationen? Es wäre günstig, wenn Du da ein Beispiel postest. Und schließe Code in die entsprechenden Tags ein, dann ist er besser lesbar.
 

Klendathu

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
März 2017
Beiträge
45
@ Andreas

Ja, sorry, hier ein Beispiel:

In jeder Zeile steht nur eine Zahl:

Zb:

5
10
56
74
55
58
22
58
usw.

Lg Klen
 

Andreas_

Commander
Dabei seit
Jan. 2017
Beiträge
2.172
Batch kennt keine Gleitkommazahlen. Bei Division durch 1000 währen alle von Dir gelisteten Werte 0. Man kann zwar die Zahl als String einlesen und dann den Dezimalpunkt um 3 Stellen verschieben, aber das klappt dann auch nur für Divisoren, die eine Potenz von 10 sind.

Was natürlich auch geht, man kann entsprechend der gewünschten Genauigkeit den Dividend mit einer Potenz von 10 multiplizieren und bei der Ausgabe entsprechend einen Dezimalpunkt einfügen.

Beispiele gibt es bei stackoverflow.com.
https://stackoverflow.com/questions/1503888/floating-point-division-in-a-batch-file

Aber das sind Krücken. Da ist es sinnvoller, etwas anderes als eine Batchdatei zu verwenden.
 
Zuletzt bearbeitet:

Klendathu

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
März 2017
Beiträge
45
Batch kennt keine Gleitkommazahlen. Bei Division durch 1000 währen alle von Dir gelisteten Werte 0. Man kann zwar die Zahl als String einlesen und dann den Dezimalpunkt um 3 Stellen verschieben, aber das klappt dann auch nur für Divisoren, die eine Potenz von 10 sind.

Was natürlich auch geht, man kann entsprechend der gewünschten Genauigkeit den Dividend mit einer Potenz von 10 multiplizieren und bei der Ausgabe entsprechend einen Dezimalpunkt einfügen.

Beispiele gibt es bei stackoverflow.com.
https://stackoverflow.com/questions/1503888/floating-point-division-in-a-batch-file

Aber das sind Krücken. Da ist es sinnvoller, etwas anderes als eine Batchdatei zu verwenden.
Danke Andreas, für den Hinweis. Könntest du mir eventuell ein Beispiel zeigen, wie es mit der "Krücke" funktionieren könnte? Möchte es dennoch gerne hin bekommen.

Mein neuester Versuch erzeugt immer das Ergebnis 120^^


Setlocal EnableDelayedExpansion
Set /P num2=Enter %%num2%%:
FOR /F "tokens=*" %%i IN (values.txt) DO (
set v=%%i

set /a sum1=%%i / %num2%
echo sum1="sum1"
echo %%i/%num2%=%sum1% >> resultx.txt
echo "!v!"
copy /b newfile.txt + resultx.txt + blank.txt + newfile.txt

)

@Echo off


Lg Klen
 
Zuletzt bearbeitet:

simpsonsfan

Commander
Dabei seit
Feb. 2008
Beiträge
2.851
Einmal Division durch 10, bitteschön ;-P
Code:
@echo off

Setlocal EnableDelayedExpansion
FOR /F "tokens=*" %%i IN (input.txt) DO (
echo %%ie-1 >> output.txt
)
Du solltest dich mal mit der Logik hinter dem, was du ausführst beschäftigen, nicht nur irgendwas irgendwo her kopieren. Zudem, packe doch, wie oben schon erwähnt wurde, Code, den du hier im Forum postest bitte in [code]...[/code]-Tags, das erleichtert die Lesbarkeit.

Die Variante mit der Kommaverschiebung würde man in Batch mit der Stringmanipulation bewerkstelligen (siehe bspw. hier). Zuerst würdest du deine bestehende Zahl einlesen, im Zweifelsfall Vor- und Nachkommastellen getrennt behandeln. Dann würdest du von dem Teil vor dem Komma nur die Anzahl an Ziffern, die nach der Division übrigbleiben ausgeben (oder eine 0, falls dies keine sind). Und anschließend würdest du ein Komma/Trennzeichen und den neuen und alten Nachkommateil ausgeben.
Wie du siehst, ein paar Schritte, deshalb eine "Krücke".
Das kannst du zur Übung gerne selbst probieren, um etwas zu lernen, wenn es ums Ergebnis geht, gibt es aber tausend viel praktischere Wege, Zahlenwerte in einer Textdatei zu dividieren, deshalb wird sich auch sonst eher weniger die Mühe machen. Zumal es dir nichts bringt, wenn dir das nur jemand anders vorsetzt, weil du dann nichts lernst.
 

Raijin

Fleet Admiral
Dabei seit
Nov. 2007
Beiträge
10.665
Ich weiß, ich habe in letzter Zeit schon einige male nach Hilfe bei Batchdateien gefragt, aber hier kommt doch noch eine^^
Hast du mal darüber nachgedacht, dass Batch dann einfach nicht das richtige Werkzeug ist?

Batch ist von den Möglichkeiten arg eingeschränkt und das was zwar möglich ist, ist zum Teil sehr kompliziert und nicht selten auch unlogisch, beispielsweise die Notwendigkeit der "delayed expansion" innerhalb von Schleifen.
Je mehr Probleme du mit Batch hast und je mehr Unterstützung du bei der Umsetzung brauchst umso mehr sollte man sich nach einer geeigneteren Skriptsprache umsehen. Wobei es für andere Skriptsprachen schon eine Beleidigung ist, mit Batch in Verbindung gebracht zu werden. PowerShell ist beispielsweise deutlich mächtiger und folgt auch eher den üblichen Prinzipien des Programmierens. Batch eignet sich vorwiegend für das banale "hintereinanderausführen" von simplen Befehlen, aber nicht als vollständige Programmierumgebung.
 

Nolag

Lieutenant
Dabei seit
Nov. 2015
Beiträge
790
Hier ist ein hybrides Batch-File, das auf fast jedem modernen Windows laufen sollte. Es verwendet den JScript Compiler um eine exe zu erzeugen und dann auszuführen:
JavaScript:
@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

"%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"

%~n0.exe %*

endlocal & exit /b %errorlevel%
*/

// JScript starts here...
import System;

var inputFile = "input.txt";
var outputFile = "output.txt";

var fso, fout, fin, ts, tsi;
fso = new ActiveXObject("Scripting.FileSystemObject");
fin = fso.GetFile(inputFile);
fout = fso.CreateTextFile(outputFile , true);
fout.Close();
fout = fso.GetFile(outputFile);
tsi = fin.OpenAsTextStream(1, -2);
ts = fout.OpenAsTextStream(2, -2);
while(!tsi.AtEndOfStream) {
  ts.WriteLine(parseFloat(tsi.ReadLine()) / 1000);
}
tsi.Close();
ts.Close();
 

Klendathu

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
März 2017
Beiträge
45
Hi Leute! Nochmals vielen Dank! Ihr konntet mir weiter helfen. Habe inzwischen festgestellt, dass Batch wohl nicht das Zeug zum optimalen Taschenrechner hat^^

Lg Klen
 
Top