Zeiten in .txt datei auslesen und Differenz berechnen
Hallo,
ich habe folgendes Problem:
Eine Pumpe protokolliert seine ON/OFF Zeiten in einer .txt Datei.
Sieht so aus:
Der Erste Block ist die Pumpennr. Darauf folgt Datum und Uhrzeit und eben der Status.
Die Blöcke sind mittels Tabulator getrennt. Ich hätte aber die Möglichkeit sie auch per Semikolon trennen zu lassen.
Ich möchte nun jeden Tag automatisiert die Einschaltdauer, also die Zeit zwischen ON->OFF berechnen.
Da ich gerne mit der Batch arbeite war mein erster Gedanke das ganze irgendwie auszulesen anschließend auszurechnen und dann in eine weitere .txt Datei zu speichern.
In der neuen .txt soll dann das Datum und die Einschaltdauer stehen.
Hätte das ganze gerne automatisiert, deshalb der Gedanke mit der Batch.
Ab und zu kommt es vor das die Pumpe auch am selben Tag nochmal anläuft. Also ein Datum 4mal vorkommt. :|
Jemand eine Idee ?
Vielen Dank
ich habe folgendes Problem:
Eine Pumpe protokolliert seine ON/OFF Zeiten in einer .txt Datei.
Sieht so aus:
001 09.04.2017 08:54 ON
001 09.04.2017 12:58 OFF
001 10.04.2017 10:11 ON
001 10.04.2017 14:12 OFF
001 11.04.2017 09:13 ON
001 11.04.2017 15:14 OFF
001 12.04.2017 10:17 ON
001 12.04.2017 14:23 OFF
Der Erste Block ist die Pumpennr. Darauf folgt Datum und Uhrzeit und eben der Status.
Die Blöcke sind mittels Tabulator getrennt. Ich hätte aber die Möglichkeit sie auch per Semikolon trennen zu lassen.
Ich möchte nun jeden Tag automatisiert die Einschaltdauer, also die Zeit zwischen ON->OFF berechnen.
Da ich gerne mit der Batch arbeite war mein erster Gedanke das ganze irgendwie auszulesen anschließend auszurechnen und dann in eine weitere .txt Datei zu speichern.
In der neuen .txt soll dann das Datum und die Einschaltdauer stehen.
Hätte das ganze gerne automatisiert, deshalb der Gedanke mit der Batch.
Ab und zu kommt es vor das die Pumpe auch am selben Tag nochmal anläuft. Also ein Datum 4mal vorkommt. :|
Jemand eine Idee ?
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 335239
Url: https://administrator.de/contentid/335239
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
14 Kommentare
Neuester Kommentar
Jetzt ists besser...
Davon ausgehend, dass es mit ON beginnt und darauf ein OFF folgt, das Datum wird hier nicht mit einbezogen.
Wenn es durch ";" getrennt ist:
Davon ausgehend, dass es mit ON beginnt und darauf ein OFF folgt, das Datum wird hier nicht mit einbezogen.
Wenn es durch ";" getrennt ist:
001;09.04.2017;08:54;ON
001;09.04.2017;12:58;OFF
001;10.04.2017;10:11;ON
001;10.04.2017;14:12;OFF
001;11.04.2017;09:13;ON
001;11.04.2017;15:14;OFF
001;12.04.2017;10:17;ON
001;12.04.2017;14:23;OFF
$i=2
$y=4
$file="C:\test.txt"
$Content=gc $file
$maxlines=$Content | Measure-Object -Line |select -ExpandProperty lines
$line=1
while($line+3 -lt $maxlines){
$ON=$Content.split(";")[$i]
$i=$i+$y
$OFF=$Content.split(";")[$i]
$i=$i+$y
NEW-TIMESPAN -Start $ON -End $OFF |select days,hours,minutes,seconds
$line=$line+1
}
Days Hours Minutes Seconds
---- ----- ------- -------
0 4 4 0
0 4 1 0
0 6 1 0
0 4 6 0
Servus zusammen,
mit Batch würde ich da gar nicht mehr anfangen, Powershell bietet sich hier gerade zu an.
Du kannst es von mir aus auch TAB-Delimited lassen, das lässt sich aber im folgenden Skript einfach anpassen indem man den Delimiter in der "Import-CSV-Zeile" anpasst.
Ergebnis-CSV:
Bei dem Skript können auch problemlos mehrere unterschiedliche Pumpen gleichzeitig in der Datei bunt gemischt erfasst werden das stört es nicht, da die Daten jeweils erst nach PumpenNr und dann nach Datum "gruppiert" werden. Wie du die Zeit dargestellt haben willst wusste ich nicht, habe es einfach mal im Zeitformat formatiert, wenn du Minuten oder Stunden als Dezimal haben möchtest ist das auch kein Problem und ist in der Spalte des Custom-Objekts schnell angepasst.
Grüße und frohe Ostern
Uwe
mit Batch würde ich da gar nicht mehr anfangen, Powershell bietet sich hier gerade zu an.
Du kannst es von mir aus auch TAB-Delimited lassen, das lässt sich aber im folgenden Skript einfach anpassen indem man den Delimiter in der "Import-CSV-Zeile" anpasst.
# Quelldatei
$in = 'D:\pumpendaten.txt'
# Zieldatei
$out = 'D:\pumpendaten_fertig.csv'
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# Daten importieren "Tabdelimited" einlesen
$data = Import-CSV $in -Delimiter "`t" -Header "Pump","Date","Time","Action"
# Datum und Zeit zu einer neuen Spalte im DateTime Format anlegen
$data = $data | select *,@{n='DateTime';e={get-date "$($_.Date) $($_.Time)"}}
# Zeilen nach Pumpe gruppieren
$data | group Pump -PipelineVariable pump | %{
# nach Datum(Tag) gruppieren
$_.Group | group Date -PipelineVariable day | %{
[timespan]$time = 0
# Alle Zeitdifferenzen des Tages berechnen und summieren (können beliebig viele sein)
0..(($day.Group.Count / 2)-1) | %{$time += $day.Group[($_*2+1)].DateTime - $day.Group[($_*2)].DateTime}
# custom object mit Properties(Spalten) erstellen
[pscustomobject]@{Pump=$pump.Name;Day=$day.Name;'Total Runtime'=$time.toString('c')}
}
# Export der Daten in CSV
} | export-csv $out -Delimiter ";" -NoType
"Pump";"Day";"Total Runtime"
"001";"09.04.2017";"04:04:00"
"001";"10.04.2017";"04:01:00"
"001";"11.04.2017";"06:01:00"
"001";"12.04.2017";"04:06:00"
Bei dem Skript können auch problemlos mehrere unterschiedliche Pumpen gleichzeitig in der Datei bunt gemischt erfasst werden das stört es nicht, da die Daten jeweils erst nach PumpenNr und dann nach Datum "gruppiert" werden. Wie du die Zeit dargestellt haben willst wusste ich nicht, habe es einfach mal im Zeitformat formatiert, wenn du Minuten oder Stunden als Dezimal haben möchtest ist das auch kein Problem und ist in der Spalte des Custom-Objekts schnell angepasst.
Grüße und frohe Ostern
Uwe
Habe den allgemeinen Formatbezeichner oben auf 'c' geändert und die Variable auf [timespan] festgelegt. Damit solltest du auf deinem System keine Probleme haben.
Trotzdem ist das nicht normal, denn laut:
https://msdn.microsoft.com/de-de/library/ee372286(v=vs.110).aspx
Wird T als Formatbezeichner ebenfalls unterstützt was bei mir hier auch problemlos funktioniert:
Ich vermute du verwendest einfach eine etwas ältere Powershell auf deinem System.
Natürlich kann man das Format alternativ auch manuell definieren mit:
etc.
Trotzdem ist das nicht normal, denn laut:
https://msdn.microsoft.com/de-de/library/ee372286(v=vs.110).aspx
Wird T als Formatbezeichner ebenfalls unterstützt was bei mir hier auch problemlos funktioniert:
TimeSpan unterstützt auch die standardmäßigen "t"- und "T"-Formatzeichenfolgen, die im Verhalten identisch mit der Standardformatzeichenfolge "c" sind.
Natürlich kann man das Format alternativ auch manuell definieren mit:
$time.toString('hh\:mm\:ss')
Vielen Vielen Dank!!
Immer gerne.
Klar, das hier summiert für jede Pumpennummer unter dem Block die Total-Summe der Pumpennummer, ist ja nur eine zusätzliche Variable die die Zeiten zusätzlich summiert und dann ausgibt...
# Quelldatei
$in = 'D:\pumpendaten.txt'
# Zieldatei
$out = 'D:\pumpendaten_fertig.csv'
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# Daten importieren "Tabdelimited" einlesen
$data = Import-CSV $in -Delimiter "`t" -Header "Pump","Date","Time","Action"
# Datum und Zeit zu einer neuen Spalte im DateTime Format anlegen
$data = $data | select *,@{n='DateTime';e={get-date "$($_.Date) $($_.Time)"}}
# Zeilen nach Pumpe gruppieren
$data | group Pump -PipelineVariable pump | %{
[timespan]$pumptotal = 0
# nach Datum(Tag) gruppieren
$_.Group | group Date -PipelineVariable day | %{
[timespan]$time = 0
# Alle Zeitdifferenzen des Tages berechnen und summieren (können beliebig viele sein)
0..(($day.Group.Count / 2)-1) | %{$time += $day.Group[($_*2+1)].DateTime - $day.Group[($_*2)].DateTime}
$pumptotal += $time
# custom object mit Properties(Spalten) erstellen
[pscustomobject]@{Pump=$pump.Name;Day=$day.Name;'Total Runtime'=$time.toString('c')}
}
[pscustomobject]@{Pump="SUM for $($pump.Name)";Day='-------';'Total Runtime'=$pumptotal}
# Export der Daten in CSV
} | export-csv $out -Delimiter ";" -NoType
Hier mal ein Paar Links ...
Die Technetlektüre bei MS direkt gibt dir ebenfalls genügend Stoff, damit habe ich es mir damals selber beigebracht.
- http://www.powershellpraxis.de/
- http://powershell.com/cs/
- http://powershell.com/cs/media/13/default.aspx
- Einstieg in Scripting
- PowerShell for Runaways - Part I
- PowerShell For Runaways - Part II
Die Technetlektüre bei MS direkt gibt dir ebenfalls genügend Stoff, damit habe ich es mir damals selber beigebracht.
Da gibt es mehrere Möglichkeiten:
Add-Content
oder auch
Out-File mit Parameter -Append
https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powe ...
Alles natürlich via Pipe an die CMDLets übertragbar.
Add-Content
oder auch
Out-File mit Parameter -Append
Die Doku zum cmdlet export-csv gibt da nichts her.
Dann hast du es überlesen, Export-CSV unterstützt ebenfalls den Parameter -Append https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powe ...
Alles natürlich via Pipe an die CMDLets übertragbar.
Wenn du dir die Member des Objekts mal angesehen hättest, hättest du diese Eigenschaft gefunden:
Ebenfalls hier nachzulesen
https://msdn.microsoft.com/de-de/library/system.timespan(v=vs.110).aspx
$pumptotal.TotalHours
Ebenfalls hier nachzulesen
https://msdn.microsoft.com/de-de/library/system.timespan(v=vs.110).aspx
Doch , TotalHours ist vom Typ Double damit kannst Du ganz regulär rechnen!
Oder du Subtrahierst mit der entsprechenden Methode 4 Tage und 4 Stunden...
Steht übrigens ebenfalls auf der oben verlinkten Seite.
Du musst hier mehr Experimentierfreude zeigen, Get-Member und format-List sind allseits deine Freunde , damit bekommst du die Infos die du brauchst.
Viel Erfolg weiterhin.
Grüße Uwe
p.s. wenn noch weitere Fragen sind bitte #PM, sonst wird das hier für andere zu unübersichtlich. Merci.
$pumptotal.TotalHours - 100
$pumptotal.Subtract(([timespan]"4.04:00:00"))
Du musst hier mehr Experimentierfreude zeigen, Get-Member und format-List sind allseits deine Freunde , damit bekommst du die Infos die du brauchst.
Viel Erfolg weiterhin.
Grüße Uwe
p.s. wenn noch weitere Fragen sind bitte #PM, sonst wird das hier für andere zu unübersichtlich. Merci.