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

Klendathu

Cadet 3rd Year
Registriert
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%
 
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.
 
awk '{print ($1/1000)}' foo.txt

Ist allerdings Unix, awk gibt es auch für DOS.
 
  • Gefällt mir
Reaktionen: teufelernie
@ 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
 
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:
  • Gefällt mir
Reaktionen: Klendathu
Andreas_ schrieb:
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:
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.
 
  • Gefällt mir
Reaktionen: abcddcba
Klendathu schrieb:
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.
 
  • Gefällt mir
Reaktionen: abcddcba und areiland
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();
 
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
 
Zurück
Oben