Hallo liebe Community,
ich habe als blutiger Anfänger die Aufgabe bekommen ein batch file zu schreiben, das Koordinaten, die in Mikrometern gespeichert sind, in Meter umrechnen soll.
Nach autodidaktischem Lernen der Syntax und einigem Herumprobieren macht mein File jetzt was es soll.
Leider braucht es dafür sehr, sehr lange. Ich würde mich freuen, wenn ihr mir helft den Code zu straffen und die Syntax in eurem Code erklärt, damit ich dabei noch etwas lerne.
Ich erklär die Aufgabenstellung und das File mal Schritt für Schritt.
Mein Input ist eine Datei, in der in der ersten Zeile ein Object1 steht, gefolgt von tausenden Zeilen mit je 9 Spalten. Jede Spalte entspricht einer Koordinate mit sechs Nachkommastellen und ein bis vier Stellen vor dem Komma.
Bsp.:
Das Ziel ist die Ausgabe all dieser Koordinaten in Metern, also um den Faktor 10^6 kleiner. Das "Object1" soll dabei verschwinden.
Bsp.:
Mein File liest jede Zeile, beginnend mit der Zweiten, aus und speichert den Inhalt jeder der neun Spalten in je einer Variable.
Da Batch laut Internetrecherche nicht mit Kommazahlen rechnen kann, kann ich die ausgelesenen Koordinaten nicht einfach durch eine Million teilen. Ich gehe deshalb einen Umweg.
Ich zähle die Anzahl an Zeichen der Variable V (Spalteninhalt) und hänge je nach Anzahl unterschiedlich viele Nullen vorne an.
Wie gesagt, mein File funktioniert, aber braucht eeeewig. Wie ihr sicher sehen könnt, ist es mir auch noch nicht gelungen Zählschleifen zu schreiben, die mehrere Variablen durchzählen sollen.
Ich hoffe ihr könnt mir helfen und freue mich über Antworten.
LG, snailgosh
ich habe als blutiger Anfänger die Aufgabe bekommen ein batch file zu schreiben, das Koordinaten, die in Mikrometern gespeichert sind, in Meter umrechnen soll.
Nach autodidaktischem Lernen der Syntax und einigem Herumprobieren macht mein File jetzt was es soll.
Leider braucht es dafür sehr, sehr lange. Ich würde mich freuen, wenn ihr mir helft den Code zu straffen und die Syntax in eurem Code erklärt, damit ich dabei noch etwas lerne.

Ich erklär die Aufgabenstellung und das File mal Schritt für Schritt.
Mein Input ist eine Datei, in der in der ersten Zeile ein Object1 steht, gefolgt von tausenden Zeilen mit je 9 Spalten. Jede Spalte entspricht einer Koordinate mit sechs Nachkommastellen und ein bis vier Stellen vor dem Komma.
Bsp.:
Code:
Object1
0.000000 0.000000 4.000000 2203.000000 0.000000 4.000000 0.000006 1.000000 4.000000
2203.000000 0.000000 4.000000 0.000000 0.000000 4.000000 0.000000 0.000000 0.000000
2203.000000 1.000000 4.000000 2203.000000 0.000000 4.000000 2203.000000 0.000000 0.000000
0.000006 1.000000 4.000000 2203.000000 1.000000 4.000000 2203.000000 1.000000 0.000000
0.000000 0.000000 4.000000 0.000006 1.000000 4.000000 0.000006 1.000000 0.000000
2203.000000 0.000000 4.000000 0.000000 0.000000 0.000000 2203.000000 0.000000 0.000000
2203.000000 1.000000 4.000000 2203.000000 0.000000 0.000000 2203.000000 1.000000 0.000000
0.000006 1.000000 4.000000 2203.000000 1.000000 0.000000 0.000006 1.000000 0.000000
0.000000 0.000000 4.000000 0.000006 1.000000 0.000000 0.000000 0.000000 0.000000
252.844330 1.187642 0.000000 252.558777 1.000000 0.000000 252.558777 1.000000 0.748811
256.157196 1.188245 0.000000 256.443878 1.000000 3.248366 256.443878 1.000000 0.000000
256.157196 1.188245 0.000000 256.157196 1.188245 4.000000 256.443878 1.000000 3.248366
Das Ziel ist die Ausgabe all dieser Koordinaten in Metern, also um den Faktor 10^6 kleiner. Das "Object1" soll dabei verschwinden.
Bsp.:
Code:
0.000000000000 0.000000000000 0.000004000000 0.002203000000 0.000000000000 0.000004000000 0.000000000006 0.000001000000 0.000004000000
0.002203000000 0.000000000000 0.000004000000 0.000000000000 0.000000000000 0.000004000000 0.000000000000 0.000000000000 0.000000000000
0.002203000000 0.000001000000 0.000004000000 0.002203000000 0.000000000000 0.000004000000 0.002203000000 0.000000000000 0.000000000000
0.000000000006 0.000001000000 0.000004000000 0.002203000000 0.000001000000 0.000004000000 0.002203000000 0.000001000000 0.000000000000
0.000000000000 0.000000000000 0.000004000000 0.000000000006 0.000001000000 0.000004000000 0.000000000006 0.000001000000 0.000000000000
0.002203000000 0.000000000000 0.000004000000 0.000000000000 0.000000000000 0.000000000000 0.002203000000 0.000000000000 0.000000000000
0.002203000000 0.000001000000 0.000004000000 0.002203000000 0.000000000000 0.000000000000 0.002203000000 0.000001000000 0.000000000000
0.000000000006 0.000001000000 0.000004000000 0.002203000000 0.000001000000 0.000000000000 0.000000000006 0.000001000000 0.000000000000
0.000000000000 0.000000000000 0.000004000000 0.000000000006 0.000001000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000
0.000252844330 0.000001187642 0.000000000000 0.000252558777 0.000001000000 0.000000000000 0.000252558777 0.000001000000 0.000000748811
0.000256157196 0.000001188245 0.000000000000 0.000256443878 0.000001000000 0.000003248366 0.000256443878 0.000001000000 0.000000000000
0.000256157196 0.000001188245 0.000000000000 0.000256157196 0.000001188245 0.000004000000 0.000256443878 0.000001000000 0.000003248366
Code:
set /a LineNo=1
:repeat
for /L %%v in (1,1,9) do (
set "V%%v="
)
for /f "tokens=1-9" %%a in ('more/e +%LineNo% ^< "input.raw"') do (
if defined V1 goto :skipread
set "V1=%%a"
set "V2=%%b"
set "V3=%%c"
set "V4=%%d"
set "V5=%%e"
set "V6=%%f"
set "V7=%%g"
set "V8=%%h"
set "V9=%%i"
)
if not defined V1 goto :eof
:skipread
::hier kommt noch mehr Code hin; siehe weiter unten
set /a LineNo+=1
goto :repeat
Da Batch laut Internetrecherche nicht mit Kommazahlen rechnen kann, kann ich die ausgelesenen Koordinaten nicht einfach durch eine Million teilen. Ich gehe deshalb einen Umweg.
Ich zähle die Anzahl an Zeichen der Variable V (Spalteninhalt) und hänge je nach Anzahl unterschiedlich viele Nullen vorne an.
Code:
for /L %%z in (1,1,9) do (
set /a "Z%%z=0"
)
set "T1=%V1%"
set "T2=%V2%"
set "T3=%V3%"
set "T4=%V4%"
set "T5=%V5%"
set "T6=%V6%"
set "T7=%V7%"
set "T8=%V8%"
set "T9=%V9%"
set /a C=1
:loop
set /a Z%C%+=1
set "T%C%=!T%C%:~1!"
if not defined T%C% call :Conv
if %C%==10 goto :Ausgabe
goto :loop
:Ausgabe
echo %A1% %A2% %A3% %A4% %A5% %A6% %A7% %A8% %A9%>>output.raw
:Conv
if !Z%C%!==8 set A%C%=0.00000!V%C%:.=!
if !Z%C%!==9 set A%C%=0.0000!V%C%:.=!
if !Z%C%!==10 set A%C%=0.000!V%C%:.=!
if !Z%C%!==11 set A%C%=0.00!V%C%:.=!
set /a C+=1
goto :eof
Wie gesagt, mein File funktioniert, aber braucht eeeewig. Wie ihr sicher sehen könnt, ist es mir auch noch nicht gelungen Zählschleifen zu schreiben, die mehrere Variablen durchzählen sollen.
Ich hoffe ihr könnt mir helfen und freue mich über Antworten.
LG, snailgosh