我试图找到一种最有效的方法来筛选出一个由大约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
所以,在上面的例子中,我需要删除行3
和7
。现在,目前没有关于如何在哈希中对用户进行分组的实际分组,它们只是铲进去。我想知道是否可以从最终产品哈希中做到这一点,如上所示。思考?
也许这可以帮助。
如果你的大哈希看起来像这样:
$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 }
}
}