PowerShell importiert meine Zeitwerte falsch?

1 Antwort

Keine Ahnung wie Dein csv Strukturiert ist , deshalb meine Auslegung:

test.csv

"Name","Antwortzeit","WasWeissDerFuchs"
"Karl","11:50:22","blubb"
"Frieda","02:10:00","blah"
"Max","05:00:00","miff"
"Olga","07:52:11","murr"
"Harry","05:20:52","brr"

WTF... Wo hast Du denn $data[730..737]. "Antwortzeit" abgeguckt?😏 ist ja gruselig🥶

Erstmal einfach Importieren und etwas Anzeigen:

$Data = Import-Csv -Path 'Test.csv'
  #mal zerlegen:
$Data|
    ForEach-Object {
          # eingelesene Daten als Tabellen mal anzeigen
        $_|ft
         #deine Zeiten sind Zeitspannen also vom Typ [TimeSpan] dazu
         #ergo müssen  wir die Strings in der Poperty "Antwortzeit"  in einen TimeSpan casten
         #mal Anzeigen
        'Timespan-Objekt :'
        [TimeSpan]$_.Antwortzeit|fl *
    }
pause

...klappt.

Man kann zwar TimeSpans addieren und subtrahieren:

[TimeSpan]'11:50:22' + [TimeSpan]'02:10:00'
[TimeSpan]'11:50:22' - [TimeSpan]'02:10:00'

...aber die für einen Durchschnittswert nötige Division ist nicht direkt möglich. Allerdings kann man mit der .Ticks -Property wunderbar Rechnen (ist ein 64Bit-Integer/Long)

$DurschnittTicks= ([TimeSpan]'11:50:22' + [TimeSpan]'02:10:00').Ticks / 2
$DurschnittTicks   #mal  anzeigen
[TimeSpan]$DurschnittTicks   #wieder  zu  einem TimeSpan  casten

..war doch simpel...

Jetzt berechnen wir die Durchschnittszeit mal richtig ordentlich:

$Data = Import-Csv -Path 'Test.csv'
$DurchschnittsZeit = $Data|
    ForEach-Object -Begin {
        $Count=0
        $Summe=0
    } -Process {
        $Count++  #mitzählen damit   wir  im Endblock  die Summe teilen können
        $Summe += ([TimeSpan]$_.Antwortzeit).Ticks 
    } -End {
        [TimeSpan]($Summe / $Count)  #Summe  der Ticks durch  Anzahl  der gesammelten Werte  zu  eienm TimeSpan  casten
    }
$DurchschnittsZeit
$DurchschnittsZeit.toString('hh\:mm\:ss')
pause

Kurzfassung:

...
$DurchschnittsZeit = $Data|%{$Count=0;$Summe=0}{$Count++;$Summe += ([TimeSpan]$_.Antwortzeit).Ticks}{[TimeSpan]($Summe / $Count)}
...

das geht auch mit ausgewählten Arrayelementen:

$DurchschnittsZeit = $Data[2..4]|  ...usw.

Viele Wege führen nach Rom:

$Data = Import-Csv -Path 'Test.csv'

[Timespan](($Data.Antwortzeit|%{$sum=0}{$sum+=([TimeSpan]$_).Ticks}{$sum}) / $Data.Count)

[Timespan][Long](($Data.Antwortzeit|%{([TimeSpan]$_).Ticks}| Measure-Object -sum).sum / $Data.Count)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren