Rechnen in Batch-Dateien
Hallo zusammen,
ich bin neu hier. Nach 3-tägiger Suche nach einer Lösung, bin ich nun hier gelandet und hoffe, dass mir ein Profi weiterhelfen kann.
Folgendes Problem:
Ich möchte in einer kleinen Batch Datei Daten aus einer automatisch generierten .csv Datei auslesen, selektieren und dann wieder in einer .txt-Datei abspeichern. Soweit bin ich schon. Nun die Frage: Kann ich mit einem Wert (Zahl, Integer), welchen ich aus der .csv Datei ausgelesen habe in der Batch-Datei auch rechnen, ihn z.B. mal 0,66 nehmen (oder auch *2/3)?
Hintergrund: Die in der .csv Datei abgelegten Zahlenwerte sind hochrechenbar (eben mit dem angegebenen, festen Faktor). Diese hochgerechnete Zahl benötige ich dann zusätzlich als Ausgabe in der .txt-Datei.
Hier mein bisheriger Code:
Und so sieht der Inhalt der .csv-Datei aus:
Das ist der Inhalt der momentanen ausgabe.txt:
und so soll es eingentlich aussehen:
Die Rundung bei der zweiten Zahl ist nicht kritisch. Ohne runden geht auch OK.
Trotz das ich die letzten drei Tage alle erdenkliche Literatur zum Thema Batch-Programmierung (u.a. von Biber, Workshop for runaways usw.) gelesen habe, komm' ich nicht auf die Lösung. Ich kann z.B. nicht erfolgreich die %%b%%c in eine andere Variable überführen z.B. va=%%b%%c und va dann weiter zum Rechnen verwenden. Das klappt nicht bzw jeweils pro Batch-Durchlauf nur ein einziges Mal (und zwar immer nur mit der letzten Zahl in der Tabelle).
Bitte helft mir, ich will nicht dumm sterben!
Vielen Dank!
Gruß
Howard
ich bin neu hier. Nach 3-tägiger Suche nach einer Lösung, bin ich nun hier gelandet und hoffe, dass mir ein Profi weiterhelfen kann.
Folgendes Problem:
Ich möchte in einer kleinen Batch Datei Daten aus einer automatisch generierten .csv Datei auslesen, selektieren und dann wieder in einer .txt-Datei abspeichern. Soweit bin ich schon. Nun die Frage: Kann ich mit einem Wert (Zahl, Integer), welchen ich aus der .csv Datei ausgelesen habe in der Batch-Datei auch rechnen, ihn z.B. mal 0,66 nehmen (oder auch *2/3)?
Hintergrund: Die in der .csv Datei abgelegten Zahlenwerte sind hochrechenbar (eben mit dem angegebenen, festen Faktor). Diese hochgerechnete Zahl benötige ich dann zusätzlich als Ausgabe in der .txt-Datei.
Hier mein bisheriger Code:
echo on
for /F "tokens=1-4 delims=. " %%a in ('date/T') do set DATE=%%c%%b%%a
for /F "tokens=1-4 delims=. " %%a in ('date/T') do set DATE2=%%d%%c%%b
set /A TODAY = DATE
set /A YYYYMM = DATE2
set PLANTNAME=MeinePV-Anlage1
SET FILENAM=%PLANTNAME%-%TODAY%.csv
SET FILENAM2=%PLANTNAME%-%YYYYMM%.csv
for /F "skip=9 tokens=1,4,5 delims=;, " %%a in (%FILENAM2%) do (
echo mo[mx++]="%%a|%%b%%c" >> ausgabe.txt
)
@echo off
Und so sieht der Inhalt der .csv-Datei aus:
sep=;
Version CSV1|Tool SE|Linebreaks CR/LF|Delimiter semicolon|Decimalpoint comma|Precision 3
;SN: 2100169189;SN: 2100169189
;SB 4000TL-20;SB 4000TL-20
;2100169189;2100169189
;Gesamtertrag;Tagesertrag
;Counter;Analog
dd.MM.yyyy;kWh;kWh
01.04.2010;224,843;10,865
02.04.2010;243,803;18,960
03.04.2010;252,476;8,673
04.04.2010;258,248;5,772
05.04.2010;268,377;10,129
06.04.2010;291,971;23,594
07.04.2010;314,708;22,737
08.04.2010;318,738;4,030
09.04.2010;323,915;5,177
10.04.2010;338,523;14,608
Das ist der Inhalt der momentanen ausgabe.txt:
mo[mx++]="01.04.2010|10865"
mo[mx++]="02.04.2010|18960"
mo[mx++]="03.04.2010|8673"
mo[mx++]="04.04.2010|5772"
mo[mx++]="05.04.2010|10129"
mo[mx++]="06.04.2010|23594"
mo[mx++]="07.04.2010|22737"
mo[mx++]="08.04.2010|4030"
mo[mx++]="09.04.2010|5177"
mo[mx++]="10.04.2010|14608"
und so soll es eingentlich aussehen:
mo[mx++]="01.04.2010|10865|7243"
mo[mx++]="02.04.2010|18960|12639"
mo[mx++]="03.04.2010|8673|5781"
mo[mx++]="04.04.2010|5772|3847"
mo[mx++]="05.04.2010|10129|6752"
mo[mx++]="06.04.2010|23594|15729"
mo[mx++]="07.04.2010|22737|15157"
mo[mx++]="08.04.2010|4030|2686"
mo[mx++]="09.04.2010|5177|3451"
mo[mx++]="10.04.2010|14608|9738"
Die Rundung bei der zweiten Zahl ist nicht kritisch. Ohne runden geht auch OK.
Trotz das ich die letzten drei Tage alle erdenkliche Literatur zum Thema Batch-Programmierung (u.a. von Biber, Workshop for runaways usw.) gelesen habe, komm' ich nicht auf die Lösung. Ich kann z.B. nicht erfolgreich die %%b%%c in eine andere Variable überführen z.B. va=%%b%%c und va dann weiter zum Rechnen verwenden. Das klappt nicht bzw jeweils pro Batch-Durchlauf nur ein einziges Mal (und zwar immer nur mit der letzten Zahl in der Tabelle).
Bitte helft mir, ich will nicht dumm sterben!
Vielen Dank!
Gruß
Howard
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 140726
Url: https://administrator.de/contentid/140726
Ausgedruckt am: 24.11.2024 um 14:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Howard und willkommen im Forum!
Meintest Du das so?
Grüße
bastla
[Edit] @77559: "DATE" hatte ich doch glatt übersehen - ist jetzt angepasst ... [/Edit]
Meintest Du das so?
@echo on & setlocal
for /F "tokens=1-4 delims=. " %%a in ('date/T') do set "TODAY=%%c%%b%%a"
for /F "tokens=1-4 delims=. " %%a in ('date/T') do set "YYYYMM=%%d%%c%%b"
set "PLANTNAME=MeinePV-Anlage1"
set "FILENAM=%PLANTNAME%-%TODAY%.csv"
set "FILENAM2=%PLANTNAME%-%YYYYMM%.csv"
del ausgabe.txt 2>nul
for /F "skip=9 tokens=1,4,5 delims=;, " %%a in (%FILENAM2%) do call :ProcessLine "%%a" "%%b%%c"
goto :eof
:ProcessLine
set /a "Erg=%~2*2/3"
>>ausgabe.txt echo mo[mx++]="%~1|%~2|%Erg%"
goto :eof
bastla
[Edit] @77559: "DATE" hatte ich doch glatt übersehen - ist jetzt angepasst ... [/Edit]
Hallo Howard,
ich glaube du willst zuviel auf einmal
Ein paar Anmerkungen:
Zeile 13 muss also in jedem Fall überarbeitet werden, das schau ich mir gleich mal im Detail an.
Gruß
LotPings
Edit: @bastla wenn man schneller ist, übersieht man eben schonmal etwas
ich glaube du willst zuviel auf einmal
Ein paar Anmerkungen:
- Die Variable date ist eine Systemvariable, die solltest du nicht überschreiben.
- Wenn du einer Variable den "Inhalt" einer anderen Variablen zuweisen willst musst du den Namen in %-Zeichen (oder bei delayedExpansion in !-Zeichen) einfassen.
- Beim Set-Befehl werden die Leerzeichen vor und nach dem Gleichheitszeichen Bestandteil des Names/des Inhalts - also weglassen!
- Mit set /a kannst du rechnen aber nur Integer-Arithmetik mit 32Bit inkl.. Vorzeichen.
- Wenn du rechnest innerhalb einer Schleife wirst du DelayedExpansion oder Subroutinen einsetzen müssen.
- Ist gewährleistet das der Nachkommateil der kWh immer 3 Stellig ist?
- Beim Rechnen in batches ist zu beachten das führende Nullen (leider) immer als Oktal-Prefix betrachtet werden.
Zeile 13 muss also in jedem Fall überarbeitet werden, das schau ich mir gleich mal im Detail an.
Gruß
LotPings
Edit: @bastla wenn man schneller ist, übersieht man eben schonmal etwas
Moin Howard,
dafür brauhst du das Datum in sortierfähiger Form YYYYMMDD in einer Hilfsspalte,
Datei mit Sort /R absteigend sortieren und Hilfspalte wieder entfernen.
ungetestet:
Gruß
LotPngs
dafür brauhst du das Datum in sortierfähiger Form YYYYMMDD in einer Hilfsspalte,
Datei mit Sort /R absteigend sortieren und Hilfspalte wieder entfernen.
ungetestet:
@echo on & setlocal
for /F "tokens=1-4 delims=. " %%a in ('date/T') do set "TODAY=%%c%%b%%a"
for /F "tokens=1-4 delims=. " %%a in ('date/T') do set "YYYYMM=%%d%%c%%b"
set "PLANTNAME=MeinePV-Anlage1"
set "FILENAM=%PLANTNAME%-%TODAY%.csv"
set "FILENAM2=%PLANTNAME%-%YYYYMM%.csv"
del ausgabe.txt 2>nul
Del unsort.txt 2>nul
for /F "skip=9 tokens=1,4,5 delims=;, " %%a in (%FILENAM2%) do call :ProcessLine "%%a" "%%b%%c"
For /f "tokens=1,* delims=#" %%a in ('Sort /r unsort.txt') do >>ausgabe.txt Echo.%%b
goto :eof
:ProcessLine
set /a "Erg=%~2*2/3"
set Datum=%~1
>>unsort.txt echo %Datum:~6,4%%Datum:~3,2%%Datum:~,2%#mo[mx++]="%~1|%~2|%Erg%"
goto :eof
Gruß
LotPngs