基于两列从CSV文件中删除重复项

f2uvfpb9  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(50)

我有一个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

oyxsuwqo

oyxsuwqo1#

首先使用Group-ObjectSubName属性分组,然后对每个组使用Sort-ObjectRank排序(表达式$_.Rank -replace '\D' -as [int]删除任何非数字位,然后将结果字符串转换为整数以进行正确排序),最后使用Select-Object只取一个对象,跳过其余的:

$inputCsv | Group-Object SubName | ForEach-Object {
    $_.Group |
        Sort-Object { $_.Rank -replace '\D' -as [int] } |
        Select-Object -First 1
}

字符串

**注意:**如果Rank属性中的值总是个位数,则可以使用Sort-Object Rank

xcitsw88

xcitsw882#

尝试:

$csv = @"
Name,SubName,Rank
NAME1,SUBNAME1,TEST1
NAME2,SUBNAME2,TEST1
NAME2,SUBNAME2,TEST3
NAME3,SUBNAME3,TEST2
NAME4,SUBNAME4,TEST3
NAME4,SUBNAME4,TEST2
"@
$table = $csv | ConvertFrom-Csv

$filtered = $table | sort-Object -Property Name,Sbuname,Rank | Group-Object -Property Name, SubName | Foreach { $_.Group[0]}

$filtered

字符串
结果

Name  SubName  Rank
----  -------  ----
NAME1 SUBNAME1 TEST1
NAME2 SUBNAME2 TEST1
NAME3 SUBNAME3 TEST2
NAME4 SUBNAME4 TEST2

相关问题