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
并得到图片中的数据?
解决方案
ID
按with分组后Group-Object
,您可以迭代每个组并System.Management.Automation.PSCustomObject
使用要在输出 CSV 文件中导出的属性创建一个新组。
因为ID
我们只是使用分组键。我们选择第一个没有该属性或空版本的对象Name
,使用. 对于并且我们选择具有这些属性值的对象。Duration
$null
System.String.IsNullOrEmpty()
Start_Call
End_Call
Call_Type
过滤由 完成Where-Object
。为了获得属性的第一个版本和扩展版本,我们还使用-First
and -ExpandProperty
from 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 文件中的所有引号?.
推荐阅读
- vb.net - VB:语句出现在方法体之外
- tensorflow - Keras model.fit 在 TPU 上训练时导致 InvalidArgumentError
- java - 事务回滚在春季不起作用
- swiftui - 如何使用 .onDelete 中的值删除 FMDB 数据
- c# - 如何避免在 ASP.NET 核心控制器中重新加载资源
- java - 在java中重用现有接口实现的设计模式
- reactjs - 将 Wordpress 页面(跨域)嵌入到具有动态高度的 React 应用程序中
- sql-server - 使用 FV 和付款的现值公式
- python - 如何从熊猫中的数据框中按百分位数制作固定数量的组
- python - 用日期时间数据 matplotib 绘制垂直线