PowerShell. Использование групповых объектов в одном файле

Я пытаюсь объединить несколько строк в одну при условии, что ключевая ячейка такая же. И записать данные из всех строк одним ключом в последнюю строку.

Пример Pic

**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 ?.

Другие вопросы по тегам