Следующее не выводит сводную таблицу, но выполняет желаемую группировку и агрегирование :
$rows = @'
taskname,start,durationinSec
TaskA,"6/5/2018 12:16:36 PM",312
TaskB,"6/5/2018 12:30:36 PM",200
TaskA,"6/6/2018 08:00:00 AM",150
TaskA,"6/6/2018 03:00:00 PM",150
'@ | ConvertFrom-Csv
$rows | Group-Object { (-split $_.start)[0] }, taskname | ForEach-Object {
$_ | Select-Object @{ n='Date'; e={$_.Values[0]} },
@{ n='Task'; e={$_.Values[1]} },
@{ n='Duration'; e={ ($_.Group | Measure-Object durationInSec -Sum).Sum } }
}
(-split $_.start)[0]
разбивает каждое значение start
на пробелы и возвращаетпервый токен ([0]
), который является частью даты метки времени;например, 6/5/2018
возвращается для 6/5/2018 12:16:36 PM
;передача этой операции в виде блока сценария ({ ... }
) в Group-Object
означает, что группировка происходит только по дате, а не по времени (в дополнение к группированию по taskname
).
Это приводит к:
Date Task Duration
---- ---- --------
6/5/2018 TaskA 312
6/5/2018 TaskB 200
6/6/2018 TaskA 300
Чтобы построить вывод, подобный сводной таблице , требуется значительно больше усилий, и он не будет быстрым:
Предположим, что $objs
содержит объектысозданный выше ($objs = $rows | Group-Object ...
).
# Get all distinct dates.
$dates = $objs | Select-Object -Unique -ExpandProperty Date
# Get all distinct tasks.
$tasks = $objs | Select-Object -Unique -ExpandProperty Task
# Create an ordered hashtable that contains an entry for each task that
# holds a nested hashtable with (empty-for-now) entries for all dates.
$ohtPivot = [ordered] @{}
$tasks | ForEach-Object {
$ohtDates = [ordered] @{}
$dates | ForEach-Object { $ohtDates[$_] = $null }
$ohtPivot[$_] = $ohtDates
}
# Fill the hashtable from the grouped objects with the task- and
# date-specific durations.
$objs | ForEach-Object { $ohtPivot[$_.Task][$_.Date] = $_.Duration }
# Output the resulting hashtable in pivot-table-like form by transforming
# each entry into a custom object
$ohtPivot.GetEnumerator() | ForEach-Object {
[pscustomobject] @{ Task = $_.Key } | Add-Member -PassThru -NotePropertyMembers $_.Value
}
Вышеуказанные выходы:
Task 6/5/2018 6/6/2018
---- -------- --------
TaskA 312 300
TaskB 200