CSV文件- Powershell -使用CountIF将重复值转换为唯一ID

4ioopgfo  于 2023-03-18  发布在  Shell
关注(0)|答案(1)|浏览(159)

我试着在powershell中使用哈希表来做vlookup,但是有些值有多个匹配项,正如你所知道的,vlookup只匹配第一个值,然后继续,所以我希望得到一些帮助来完成下面的工作,为每个记录分配一个唯一的id。
样本数据:
| 组名|计数如果|
| - ------|- ------|
| 漫威|三个|
| 漫威|三个|
| 漫威|三个|
| 数据控制单元|四个|
| 数据控制单元|四个|
| 数据控制单元|四个|
| 数据控制单元|四个|
| 世界银行|五个|
| 世界银行|五个|
| 世界银行|五个|
| 世界银行|五个|
| 世界银行|五个|
预期输出:
| 组名|计数如果|唯一ID|
| - ------|- ------|- ------|
| 漫威|三个|漫威3|
| 漫威|三个|漫威2|
| 漫威|三个|漫威一号|
| 数据控制单元|四个|DCU-4|
| 数据控制单元|四个|数据控制单元-3|
| 数据控制单元|四个|DCU-2|
| 数据控制单元|四个|DCU-1|
| 世界银行|五个|WB-5|
| 世界银行|五个|白细胞4号|
| 世界银行|五个|白细胞3号|
| 世界银行|五个|白细胞2号|
| 世界银行|五个|白细胞1号|
我尝试过使用ref给值附加一个id,但是它没有提供定向结果。

uid=0
$filename | Select-Object @{n="UniquidID"; e={$_.GroupName,(([ref]$uid).Value++) -Join "-" }}

上面的代码返回UniqueID如下:
| 唯一ID|
| - ------|
| 奇迹-0|
| 漫威一号|
| DCU-2|
| 漫威3|
| ...|

63lcw9qa

63lcw9qa1#

如果我没理解错的话,您只需要循环GroupName,然后创建一个新的UniqueID属性,该属性使用GroupName的值加上一个从1开始的索引:

Import-Csv path\to\input.csv | Group-Object GroupName | ForEach-Object {
    $idx = @{ i = 1 }
    $_.Group | Select-Object *, @{ N='UniqueID'; E= { '{0}-{1}' -f $_.GroupName, $idx.i++ }}
}

输出应该看起来像一个预期的,缺点是Group-Object不会保持相同的顺序作为您的输入,但这可以解决Sort-Object如果需要。

GroupName CountIf UniqueID
--------- ------- --------
DCU       4       DCU-1
DCU       4       DCU-2
DCU       4       DCU-3
DCU       4       DCU-4
Marvel    3       Marvel-1
Marvel    3       Marvel-2
Marvel    3       Marvel-3
WB        5       WB-1
WB        5       WB-2
WB        5       WB-3
WB        5       WB-4
WB        5       WB-5

相关问题