【问题标题】:PowerShell. Group-object usage in one file电源外壳。在一个文件中使用组对象
【发布时间】:2020-07-27 23:36:22
【问题描述】:

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

Example 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  

并得到如图所示的数据?

【问题讨论】:

    标签: powershell group-object


    【解决方案1】:

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

    对于ID,我们只需使用分组键。 NameDuration 我们使用System.String.IsNullOrEmpty() 选择第一个没有$null 或该属性的空版本的对象。对于Start_CallEnd_Call,我们为Call_Type 属性选择具有这些值的对象。

    过滤由Where-Object完成。为了获得属性的第一个版本和扩展版本,我们还使用来自Select-Object-First-ExpandProperty

    $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 文件中删除引号,可以使用 Export-Csv 中的 -UseQuotes 开关。但是,您确实需要 PowerShell 7。如果您使用较低的 PowerShell 版本,您可以使用来自 How to remove all quotations mark in the csv file using powershell script? 的一些建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多