首页 > 解决方案 > 电源外壳。在一个文件中使用组对象

问题描述

如果关键单元格相同,我正在尝试将几行合并为一行。并将具有相同键的所有行的数据写入最后一行。

示例图片

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

并得到图片中的数据?

标签: powershellgroup-object

解决方案


ID按with分组后Group-Object,您可以迭代每个组并System.Management.Automation.PSCustomObject使用要在输出 CSV 文件中导出的属性创建一个新组。

因为ID我们只是使用分组键。我们选择第一个没有该属性或空版本的对象Name,使用. 对于并且我们选择具有这些属性值的对象。Duration$nullSystem.String.IsNullOrEmpty()Start_CallEnd_CallCall_Type

过滤由 完成Where-Object。为了获得属性的第一个版本和扩展版本,我们还使用-Firstand -ExpandPropertyfrom 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

输出.csv

"ID";"Name";"Duration";"Start_Call";"End_Call"
"1234509";"Mike";"600";"2020-01-02T01:22:33";"2020-01-02T01:32:33"

如果要从 CSV 文件中删除引号,可以使用-UseQuotes开关 from Export-Csv。但是,yhis 确实需要PowerShell 7。如果您使用较低的 PowerShell 版本,则可以使用如何使用 powershell 脚本删除 csv 文件中的所有引号?.


推荐阅读