Bildung von Mittelwert diverser Zahlen aus einer txt-Datei
Hallo,
ich habe folgendes Problem, bei dem ich nicht so recht weiß, wie man es anpacken soll. Ich weiß leider nicht, ob Batch das Richtige dafür ist, ich versuche es aber mal trotzdem.
Folgender Sachverhalt:
Eine Wetterstation speichert jeden Tag die Temperatur und diverse andere Messwerte mit einem Datum- und Zeitstempel in einer .txt-Datei ab.
Ich habe somit jeden Tag eine neue .txt-Datei mit insgesamt 1440 Messreihen. Die Datei sieht wie folgt aus:
Dateiname: wetter21_06_14.txt
21.06.14;00:00:00;146;0.111;12.2
21.06.14;00:01:00;134;0.098;12.3
21.06.14;00:02:00;131;0.095;12.2
21.06.14;00:03:00;123;0.087;12.2
21.06.14;00:04:00;138;0.103;12.3
21.06.14;00:05:00;131;0.095;12.3
21.06.14;00:06:00;139;0.104;12.2
21.06.14;00:07:00;150;0.115;12.1
usw.
Die einzelnen Werte sind jeweils mit einem Semikolon voneinander getrennt.
Da man diese 1440 Werte schlecht weiterverarbeiten kann, sollen die einzelnen Textpassagen (Zeilen) in Gruppen zu 30 eingeteilt werden mit einer anschließenden Mittelwertbildung.
Das heißt: Man nimmt immer die 30 ersten Zeilen, dann die nächsten 30 Zeilen usw..
Dabei muss dann von den letzten drei Werten einer Zeile (146, 0.111 und 12.2 (siehe Beispiel erste Zeile)) ein Mittelwert gebildet werden. Als neuer Datums- und Zeitwert für diesen Mittelwert soll dann der Wert der jeweils ersten Zeile angenommen werden.
Anschließend sollen die neuen Datensätze in eine neue .txt-Datei geschrieben werden.
Zur Verdeutlichung ein Beispiel der neuen .txt-Datei mit Mittenwerten:
21.06.14;00:00:00;130;0.110;12.2
21.06.14;00:30:00;134;0.112;12.2
21.06.14;01:00:00;131;0.099;12.2
21.06.14;01:30:00;130;0.098;12.3
Für Hilfe oder Vorschläge zur Erstellung so einer Lösung wäre ich sehr dankbar!!!
ich habe folgendes Problem, bei dem ich nicht so recht weiß, wie man es anpacken soll. Ich weiß leider nicht, ob Batch das Richtige dafür ist, ich versuche es aber mal trotzdem.
Folgender Sachverhalt:
Eine Wetterstation speichert jeden Tag die Temperatur und diverse andere Messwerte mit einem Datum- und Zeitstempel in einer .txt-Datei ab.
Ich habe somit jeden Tag eine neue .txt-Datei mit insgesamt 1440 Messreihen. Die Datei sieht wie folgt aus:
Dateiname: wetter21_06_14.txt
21.06.14;00:00:00;146;0.111;12.2
21.06.14;00:01:00;134;0.098;12.3
21.06.14;00:02:00;131;0.095;12.2
21.06.14;00:03:00;123;0.087;12.2
21.06.14;00:04:00;138;0.103;12.3
21.06.14;00:05:00;131;0.095;12.3
21.06.14;00:06:00;139;0.104;12.2
21.06.14;00:07:00;150;0.115;12.1
usw.
Die einzelnen Werte sind jeweils mit einem Semikolon voneinander getrennt.
Da man diese 1440 Werte schlecht weiterverarbeiten kann, sollen die einzelnen Textpassagen (Zeilen) in Gruppen zu 30 eingeteilt werden mit einer anschließenden Mittelwertbildung.
Das heißt: Man nimmt immer die 30 ersten Zeilen, dann die nächsten 30 Zeilen usw..
Dabei muss dann von den letzten drei Werten einer Zeile (146, 0.111 und 12.2 (siehe Beispiel erste Zeile)) ein Mittelwert gebildet werden. Als neuer Datums- und Zeitwert für diesen Mittelwert soll dann der Wert der jeweils ersten Zeile angenommen werden.
Anschließend sollen die neuen Datensätze in eine neue .txt-Datei geschrieben werden.
Zur Verdeutlichung ein Beispiel der neuen .txt-Datei mit Mittenwerten:
21.06.14;00:00:00;130;0.110;12.2
21.06.14;00:30:00;134;0.112;12.2
21.06.14;01:00:00;131;0.099;12.2
21.06.14;01:30:00;130;0.098;12.3
Für Hilfe oder Vorschläge zur Erstellung so einer Lösung wäre ich sehr dankbar!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 241604
Url: https://administrator.de/contentid/241604
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo Sven,
wenn dir Powershell nichts ausmacht:
(In Zeile 2 und 4 die Pfade für die Dateien angeben)
Die Rundung der Nachkommastellen (Zeilen 11-13) kannst du an deine Bedürfnisse anpassen.
Grüße Uwe
wenn dir Powershell nichts ausmacht:
(In Zeile 2 und 4 die Pfade für die Dateien angeben)
# Eingabedatei
$inputfile = "C:\wetterdaten.txt"
# Ausgabedatei
$outputfile = "C:\wetterdaten_mittelwerte.txt"
# Importiere CSV-Datei als Object
$csv = import-csv $inputfile -Delimiter ";" -Header "Datum","Zeit","Wert1","Wert2","Wert3"
# Array das später die Mittelwerte enthält
$mittelwerte = @()
# gehe die Zeilen in 30er Schritten durch und berechne die Mittelwerte
for($i=0;$i -le 1410;$i+=30){
$mw1 = [Math]::Round((($csv[$i..($i+29)].Wert1 | measure -Sum).Sum / 30),2) # Auf 2 Nachkommastellen runden
$mw2 = [Math]::Round((($csv[$i..($i+29)].Wert2 | measure -Sum).Sum / 30),4) # Auf 4 Nachkommastellen runden
$mw3 = [Math]::Round((($csv[$i..($i+29)].Wert3 | measure -Sum).Sum / 30),2) # Auf 2 Nachkommastellen runden
$mittelwerte += New-Object PSObject -Property @{"Datum"=$csv[$i].Datum;"Zeit"=$csv[$i].Zeit;"Wert1"=$mw1;"Wert2"=$mw2;"Wert3"=$mw3}
}
# Mittelwerte in gewünschtem Format wieder ausgeben (Komma's durch Punkte ersetzen, Anführungszeichen und Header entfernen)
($mittelwerte | select Datum,Zeit,Wert1,Wert2,Wert3 | convertto-csv -Delimiter ";" -NoTypeInformation | out-string).Replace(",",".").Replace("""","") | select -Skip 1 | set-content $outputfile
Grüße Uwe
Zitat von @Sven289:
Vielen Dank erstmal,
Leider kann ich das Script nicht ausführen. Ich erhalte folgenden Fehler:
mach mal ein Update deiner Powershell ... mit 2.0 gehen so manche Dinge nicht, ansonsten schreibe ich es gleich noch um ... -edit- das unten geht jetzt auch mit PS2.0Vielen Dank erstmal,
Leider kann ich das Script nicht ausführen. Ich erhalte folgenden Fehler:
Auch würde ich ungerne den Dateipfad/Namen jeden Tag neu ändern wollen. Wenn möglich sollen alle Daten aus einem Ordner geholt und verarbeitet werden.
warum nicht gleich ...$files = dir "C:\Wetterdaten\*.txt"
foreach($file in $files){
# Importiere CSV-Datei als Object
$csv = import-csv $file.FullName -Delimiter ";" -Header "Datum","Zeit","Wert1","Wert2","Wert3"
# Array das später die Mittelwerte enthält
$mittelwerte = @()
# gehe die Zeilen in 30er Schritten durch und berechne die Mittelwerte
for($i=0;$i -le 1410;$i+=30){
$mw1 = [Math]::Round((($csv[$i..($i+29)].Wert1 | measure -Sum).Sum / 30),2) # Auf 2 Nachkommastellen runden
$mw2 = [Math]::Round((($csv[$i..($i+29)].Wert2 | measure -Sum).Sum / 30),4) # Auf 4 Nachkommastellen runden
$mw3 = [Math]::Round((($csv[$i..($i+29)].Wert3 | measure -Sum).Sum / 30),2) # Auf 2 Nachkommastellen runden
$mittelwerte += New-Object PSObject -Property @{"Datum"=$csv[$i].Datum;"Zeit"=$csv[$i].Zeit;"Wert1"=$mw1;"Wert2"=$mw2;"Wert3"=$mw3}
}
# Mittelwerte in gewünschtem Format wieder ausgeben (Komma's durch Punkte ersetzen, Anführungszeichen und Header entfernen)
($mittelwerte | select Datum,Zeit,Wert1,Wert2,Wert3 | convertto-csv -Delimiter ";" -NoTypeInformation) | %{$_.Replace(",",".").Replace("""","")} | select -Skip 1 | set-content "$($file.Directory)\$($file.BaseName)_Mittelwerte.txt"
}
Grüße Uwe
Zitat von @Sven289:
im neuen Textdokument angezeigt.
Ist es möglich die for-Schleife so zu ändern, dass diese abhängig von dem Zeilen in der Ausgangsdatei ist?
lässt sich machen, aber dann werden eventuell nicht alle Werte in die Mittelwerte miteinbezogen wenn z.B. die Anzahl der Zeilen nicht durch 30 teilbar ist, was willst du für diesen Fall haben ? Da sind ja noch jede Menge Variablen die ich hier nicht vorhersehen kann im neuen Textdokument angezeigt.
Ist es möglich die for-Schleife so zu ändern, dass diese abhängig von dem Zeilen in der Ausgangsdatei ist?
p.s. Excel kann deine CSV-Dateien schön auswerten und filtern !