PowerShell. Использование групповых объектов в одном файле
Я пытаюсь объединить несколько строк в одну при условии, что ключевая ячейка такая же. И записать данные из всех строк одним ключом в последнюю строку.
**Before**
ID | Name | DateTime | Duration | Call_Type |
1234509 | Mike | 2020-01-02T01:22:33 | | Start_Call |
1234509 | | 2020-01-02T01:32:33 | 600 | End_call |
ПОСЛЕ
ID | Name | DateTime | Duration | Start_Call | End_call |
1234509 | Mike | 2020-01-02T01:22:33 | 600 |2020-01-02T01:22:33 | 2020-01-02T01:32:33 |
Перед
ID;Name;DateTime;Duration;Call_Type
1234509;Mike;2020-01-02T01:22:33;;Start_Call
1234509;;2020-01-02T01:32:33;600;End_call
После
ID;Name;Duration;Start_Call;End_call
1234509;Mike;600;2020-01-02T01:22:33;2020-01-02T01:32:33
Как использовать здесь
$csv | Group-Object ID
и получить данные как на картинке?
1 ответ
После группировки по ID
с участием Group-Object
, вы можете перебрать каждую группу и создать новую System.Management.Automation.PSCustomObject
со свойствами, которые вы хотите экспортировать в выходной файл CSV.
За ID
мы просто используем ключ группировки. Name
а также Duration
мы выбираем первый объект, у которого нет $null
или пустую версию этого свойства, используя System.String.IsNullOrEmpty()
. ЗаStart_Call
а также End_Call
мы выбираем объект, который имеет эти значения для Call_Type
свойство.
Фильтрация осуществляется Where-Object
. Чтобы получить первую и расширенную версии свойств, мы также используем-First
а также -ExpandProperty
из Select-Object
.
$csv = Import-Csv -Path .\data.csv -Delimiter ";"
$groups = $csv | Group-Object -Property ID
& {
foreach ($group in $groups)
{
[PSCustomObject]@{
ID = $group.Name
Name = $group.Group | Where-Object {-not [string]::IsNullOrEmpty($_.Name)} | Select-Object -First 1 -ExpandProperty Name
Duration = $group.Group | Where-Object {-not [string]::IsNullOrEmpty($_.Duration)} | Select-Object -First 1 -ExpandProperty Duration
Start_Call = $group.Group | Where-Object {$_.Call_Type -eq "Start_Call"} | Select-Object -First 1 -ExpandProperty DateTime
End_Call = $group.Group | Where-Object {$_.Call_Type -eq "End_Call"} | Select-Object -First 1 -ExpandProperty DateTime
}
}
} | Export-Csv -Path .\output.csv -Delimiter ";" -NoTypeInformation
output.csv
"ID";"Name";"Duration";"Start_Call";"End_Call"
"1234509";"Mike";"600";"2020-01-02T01:22:33";"2020-01-02T01:32:33"
Если вы хотите удалить кавычки из файла CSV, вы можете использовать -UseQuotes
переключиться с Export-Csv
. Однако для этого требуется PowerShell 7. Если вы используете более раннюю версию PowerShell, вы можете воспользоваться некоторыми рекомендациями из раздела Как удалить все кавычки в файле csv с помощью сценария PowerShell ?.