在大型哈希的非分组部分中查找重复项的最有效方法

问题描述 投票:-1回答:1

我试图找到一种最有效的方法来筛选出一个由大约5k个对象组成的大型哈希表中的任何重复项。

我在Powershell中运行所有这些。所以,我有这个大的哈希表,其中包括(实质上)用户名和订阅名

1. User_id  |  Sub_name
2. User_id  |  Sub_name

etc...

在大多数情况下,每个User_id有5行以上,因为每个新行代表用户订阅的订阅名称。

我需要做的是:确定每个用户的任何重复订阅。例如

1. mm1234 | sub_1
2. mm1234 | sub_4
3. mm1234 | sub_1
4. mm9999 | sub_1
5. mm9999 | sub_2
6. mm8888 | sub_1
7. mm8888 | sub_1

所以,在上面的例子中,我需要删除行37。现在,目前没有关于如何在哈希中对用户进行分组的实际分组,它们只是铲进去。我想知道是否可以从最终产品哈希中做到这一点,如上所示。思考?

powershell loops hash duplicates
1个回答
0
投票

也许这可以帮助。

如果你的大哈希看起来像这样:

$hash = @{
    '1' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_1' }
    '2' = @{ 'user_uuid' = 'mm5678'; 'lob' = 'subscription_1' }
    '3' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_2' }
    '4' = @{ 'user_uuid' = 'mm5678'; 'lob' = 'subscription_5' }
    '5' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_3' }
    '6' = @{ 'user_uuid' = 'mm1478'; 'lob' = 'subscription_1' }
}

你可以创建一个新的结果哈希,其中键是user_uuid,值是唯一排序的订阅数组(或者你称之为lob

$result = @{}
$hash.Keys | ForEach-Object {
    $uid   = $hash.$_.user_uuid
    $value = $hash.$_.lob
    if ($result.ContainsKey($uid)) {
        # add to the subscriptions array for this user_uuid
        $result[$uid] = ($result[$uid] + $value) | Sort-Object -Unique 
    }
    else {
        # create an element for this user_uuid and make sure the value is an array
        $result[$uid] = @($value)
    }
}

生成的Hashtable将包含以下内容:

Name          Value                                                                                                                                                                  
----          -----                                                                                                                                                                  
mm1234        {subscription_1, subscription_2, subscription_3}                                                       
mm1478        {subscription_1}                                                                                                                                                       
mm5678        {subscription_1, subscription_5}

如果你需要将它转换回原始$hash(散列哈希)的格式,你可以这样做:

# recreate the large hash using the deduped values
$newHash = @{}
$count = 1
$result.Keys | ForEach-Object {
    foreach ($value in $result.$_) {
        $newHash[$count++] = @{ 'user_uuid' = $_; 'lob' = $value }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.