You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PowerShell对CSV按SubName去重并保留最小Rank值

解决CSV按SubName去重并保留最小Rank的问题

你的核心需求是按SubName去重,保留每个SubName对应的最小Rank行(TEST1优先,其次TEST2,仅存在TEST3时保留)。之前的代码问题出在排序逻辑和-Unique的用法上:Sort-Object "SubName",{$_.Weight -lt 3}的排序规则无法确保每个SubName下最小Weight的行排在最前面,导致-Unique无法正确筛选目标行。

正确实现方案

下面提供两种可靠的实现方式,都能满足需求:

方式一:先排序再去重(简洁高效)

# 为Rank添加权重列,同时按SubName+Weight升序排序
$processedData = $inputCsv | Select-Object Name, SubName, Rank, @{
    Name = 'Weight'
    Expression = {
        switch ($_.Rank) {
            "TEST1" { 1 }
            "TEST2" { 2 }
            "TEST3" { 3 }
        }
    }
} | Sort-Object SubName, Weight

# 按SubName去重,保留每个SubName的第一行(即权重最小的行),并移除Weight列
$result = $processedData | Select-Object Name, SubName, Rank -Unique -Property SubName

方式二:分组筛选(逻辑更直观)

$result = $inputCsv | Select-Object Name, SubName, Rank, @{
    Name = 'Weight'
    Expression = {
        switch ($_.Rank) {
            "TEST1" { 1 }
            "TEST2" { 2 }
            "TEST3" { 3 }
        }
    }
} | Group-Object -Property SubName | ForEach-Object {
    # 对每个SubName分组内的行按Weight排序,取权重最小的一行,再移除Weight列
    $_.Group | Sort-Object Weight | Select-Object -First 1 Name, SubName, Rank
}

关键说明

  • 用switch替代多分支if-else,代码更简洁易维护
  • 两种方式都通过权重映射明确Rank的优先级,确保TEST1始终被优先保留
  • 方式一利用排序后-Unique保留首个元素的特性,性能更优;方式二通过分组直接筛选,逻辑更清晰,适合复杂场景

内容的提问来源于stack exchange,提问作者A-d-r-i

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:01:16