end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

power shellでcsvファイルを読み、時間の集計

# CSVファイルのパスを指定する
$csvFilePaths = Get-ChildItem ".\20*_*_daily.csv"

# CSVファイルを読み込む
$data = $csvFilePaths | ForEach-Object { Import-Csv $_ } | Select-Object *,@{Name="FilePath";Expression={$_.PSPath}}

# FirstEventTimeとLastEventTimeの差分時間を計算し、月次に集計する
$dailyDiff = $data | ForEach-Object {
    $date = [DateTime]::ParseExact($_.Date, "yyyy/MM/dd", $null)

    if($_.FirstEventTime) {
        $firstTime = $date + [TimeSpan]::Parse($_.FirstEventTime.Trim())
    }
    if($_.LastEventTime) {
        $lastTime = $date + [TimeSpan]::Parse($_.LastEventTime.Trim())
    }

    $diff = New-TimeSpan $firstTime $lastTime
    # Diffから休憩時間の1時間を減算
    $diff = $diff.Subtract([TimeSpan]::FromHours(1))
    New-Object psobject -Property @{
        Month = "{0:yyyy/MM}" -f $firstTime
        User = $_.User
        Diff = $diff
    }
}

$monthlyDiff = $dailyDiff | Group-Object Month, User | ForEach-Object {
    $diffs = $_.Group.Diff.TotalHours
    $count = $diffs.Count
    $avg = $diffs | Measure-Object -Average | Select-Object -ExpandProperty Average
    $max = $diffs | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
    $min = $diffs | Measure-Object -Minimum | Select-Object -ExpandProperty Minimum
    $sum = $diffs | Measure-Object -Sum | Select-Object -ExpandProperty Sum
    New-Object psobject -Property @{
        Month = $_.Name.Split(',')[0]
        User  = $_.Name.Split(',')[1]
        Count = $count
        AvgDiff = [Math]::Round($avg, 1)
        MaxDiff = [Math]::Round($max, 1)
        MinDiff = [Math]::Round($min, 1)
        SumDiff = [Math]::Round($sum, 1)
    }
}

# 結果を表示する
$monthlyDiff |
Select-Object Month, User, Count, AvgDiff, MaxDiff, SumDiff, MinDiff |
Export-Csv -Path "all_member.csv" -NoTypeInformation
"Month","User","Count","AvgDiff","MaxDiff","SumDiff","MinDiff"
"2023/04"," xcendou","14","9.5","15.5","132.5","0.1"
"2023/04"," xmyokosm","16","4.4","4.4","70.9","4.4"