PowerShell. Использование группового объекта в одном файле - PullRequest
0 голосов
/ 15 апреля 2020

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

Пример Pi c

**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 Ответ

1 голос
/ 15 апреля 2020

После группировки по 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? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...