我有一个包含三列的 CSV(在
$inputCsv
中),我想从中删除 SubName 中的重复项,同时保留最小排名类别(最小值 = TEST1 和最大值 = TEST3)
Name SubName Rank
----- -------- -----
NAME1 SUBNAME1 TEST1
NAME2 SUBNAME2 TEST1
NAME2 SUBNAME2 TEST3
NAME3 SUBNAME3 TEST2
NAME4 SUBNAME4 TEST3
NAME4 SUBNAME4 TEST2
想要的结果:
Name SubName Rank
----- -------- -----
NAME1 SUBNAME1 TEST1
NAME2 SUBNAME2 TEST1
NAME3 SUBNAME3 TEST2
NAME4 SUBNAME4 TEST2
当然可以保留 TEST3,以防它是唯一可用的值。
为了方便起见,我将
Rank
转换为数字列,以便我可以订购它。我尝试了几个Sort-Object
组件但没有成功,例如:
$inputCsv | Select-Object "Name", "SubName", "Rank", @{Name = 'Weight'; Expression = {
if ( $_."Rank" -eq "TEST1" ) { 1 }
elseif ( $_."Rank" -eq "TEST2" ) { 2 }
elseif ( $_."Rank" -eq "TEST3" ) { 3 } }
} | Sort-Object "SubName",{$_.Weight -lt 3} -Unique
首先使用
Group-Object
按 SubName
属性分组,然后对每个组使用 Sort-Object
按 Rank
排序(表达式 $_.Rank -replace '\D' -as [int]
删除任何非数字数字,然后将结果字符串转换为整数以进行正确的排序)排序)最后使用 Select-Object
仅获取 1 个对象并跳过其余对象:
$inputCsv | Group-Object SubName | ForEach-Object {
$_.Group |
Sort-Object { $_.Rank -replace '\D' -as [int] } |
Select-Object -First 1
}