sven289
Goto Top

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!!!

Content-ID: 241604

Url: https://administrator.de/contentid/241604

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

colinardo
colinardo 24.06.2014 aktualisiert um 11:44:39 Uhr
Goto Top
Hallo Sven,
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  
Die Rundung der Nachkommastellen (Zeilen 11-13) kannst du an deine Bedürfnisse anpassen.

Grüße Uwe
Sven289
Sven289 24.06.2014 um 11:42:40 Uhr
Goto Top
Vielen Dank erstmal,
Leider kann ich das Script nicht ausführen. Ich erhalte folgenden Fehler:
Fehler beim Aufrufen der Methode, da [System.Object[]] keine Methode mit dem Namen "Replace" enthält.
Bei C:\Users\Benutzer\Desktop\test.ps1:17 Zeichen:111
+ ($mittelwerte | select Datum,Zeit,Wert1,Wert2,Wert3 | convertto-csv -Delimiter ";" -NoTypeInformation).Replace <<<< (",",".").Replace("""","") | > select -Skip 1 | set-con
tent $outputfile
+ CategoryInfo : InvalidOperation: (Replace:String) , RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

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.

Danke!
colinardo
colinardo 24.06.2014, aktualisiert am 26.06.2014 um 13:44:39 Uhr
Goto Top
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.0
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 face-smile ...
$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"  
}
Hängt an den Originalnamen für das neue File noch den String _Mittelwert an.

Grüße Uwe
Sven289
Sven289 24.06.2014 um 13:35:20 Uhr
Goto Top
Das funtioniert schon einmal perfekt.
Nun gibt es nur noch ein kleines Problem: Wenn eine Datei nicht alle 1440 Messwerte hat, da z.B. der Tag noch nicht rum ist oder die Station eine Stunde außer Betrieb war, wird trotzdem die Schleife bis zum Ende durchlaufen und es werden
;;0;0;0
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?

Sonst sehr gute Arbeit! Danke face-smile
colinardo
colinardo 24.06.2014, aktualisiert am 26.06.2014 um 13:44:46 Uhr
Goto Top
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 face-sad

p.s. Excel kann deine CSV-Dateien schön auswerten und filtern !
Sven289
Sven289 24.06.2014 um 14:10:42 Uhr
Goto Top
Am Einfachsten wäre es wohl, wenn die übrig bebliebenen Messwerte ignoriert werden.

Vielleicht noch etwas zur Vorgeschichte und zur Entstehung der Wetterdaten:
Ich habe bereits vor etwas längerer Zeit mal Hilfe benötigt, um die Wetterdaten, die eigenlich jede Stunde auf einen Server geladen werden zu einer Datei zusammenzuführen und in eine Ordnerstruktur zu überführen, sodass ich eine Datei für jeden Tag habe.
Siehe dazu: Link zu Batchscript, was Daten zusammenführt (unten)

Vielleicht ist es möglich, dass die Funktion des Datenzusammenführens in das Powershell-Script eingebunden wird. Dann können z. B. die Daten die schon verwendet wurden (zum Zusammenführen und anschließende Mittelwertbildung) umbenannt werden.

Was ist deine Meinung dazu?
Sven289
Sven289 24.06.2014 um 14:32:28 Uhr
Goto Top
Zitat von @colinardo:
p.s. Excel kann deine CSV-Dateien schön auswerten und filtern !

Meine Daten lasse ich mir auch mit Excel anzeigen und erstelle mir dazu Diagramme. Schön ist es aber, wenn die Daten schon in einer Form bereitstehen, die eine weitere Verarbeitung zulässt. Auch brauche ich ja eine txt- oder csv-Datei mit aufbereiteten Werten, da die Daten noch weitergereicht werden. Excel kann dies leider nicht liefern.