Powershell:哈希表的联合列表-在发生冲突时获取最新列表
我目前正在尝试合并一个N个哈希表的列表,其中每个表都包含一个时间戳和另一个哈希表列表 其思想是合并哈希表列表,并对来自具有最高时间戳的表的一行进行冲突处理 例如:Powershell:哈希表的联合列表-在发生冲突时获取最新列表,powershell,hashtable,Powershell,Hashtable,我目前正在尝试合并一个N个哈希表的列表,其中每个表都包含一个时间戳和另一个哈希表列表 其思想是合并哈希表列表,并对来自具有最高时间戳的表的一行进行冲突处理 例如: @( @{ week = '2020-05' participants = @( @{ name = 'user A' age = 35 address = 'city A'
@(
@{
week = '2020-05'
participants = @(
@{
name = 'user A'
age = 35
address = 'city A'
},
@{
name = 'user B'
age = 16
address = 'city B'
}
)
},@{
week = '2020-04'
participants = @(
@{
name = 'user A'
age = 35
address = 'city A'
},
@{
name = 'user B'
age = 16
address = 'city A'
},
@{
name = 'user C'
age = 42
address = 'city B'
}
)
}
)
请注意,对于口译,在2020-05年,我们收到了2个用户,而在2020-04年,我们收到了3个用户
现在,最终目标是得到如下列表:
result = @(
@{
week = '2020-05'
name = 'user A'
age = 35
address = 'city A'
},
@{
week = '2020-05'
name = 'user B'
age = 16
address = 'city B'
},
@{
week = '2020-04'
name = 'user C'
age = 42
address = 'city B'
}
)
我现在的问题是:不必使用显式循环,但使用foreach或select对象,就可以解决这个问题吗?我已经能够使用select object/distinct获得一个唯一用户名数组,但这里我感兴趣的不仅是可能的名称列表,还有姓名/年龄和地址的组合。将其放在这里,因为它有代码,因此注释部分太长 但是。。。但是,“用户b”在两周内,但地址不同。在正常思维中,他们是两个不同的人,因为他们的住所在两个不同的地方。因此,如果是这样的话,你所追求的最终结果是无效的
Clear-Host
@(
@{
week = '2020-05'
participants = @(
@{
name = 'user A'
age = 35
address = 'city A'
},
@{
name = 'user B'
age = 16
address = 'city B'
}
)
},@{
week = '2020-04'
participants = @(
@{
name = 'user A'
age = 35
address = 'city A'
},
@{
name = 'user B'
age = 16
address = 'city A'
},
@{
name = 'user C'
age = 42
address = 'city B'
}
)
}
) |
ConvertTo-Json -Depth 3 |
ConvertFrom-Json |
Select -ExpandProperty SyncRoot |
Select Week -ExpandProperty participants
# Results
<#
name age address week
---- --- ------- ----
user A 35 city A 2020-05
user B 16 city B 2020-05
user A 35 city A 2020-04
user B 16 city A 2020-04
user C 42 city B 2020-04
#>
使用Select-Unique
ConvertTo-Json -Depth 3 |
ConvertFrom-Json |
Select -ExpandProperty SyncRoot |
Select Week -ExpandProperty participants |
Select -Unique Name, age, address
# Results
<#
name age address
---- --- -------
user A 35 city A
user B 16 city B
user B 16 city A
user C 42 city B
#>
当然,放弃这座城市会让你得到你想要的三个,好吧,我只是在这里显示你的名字和年龄。如果用户名不能绝对保证是唯一的,那么,好吧,你知道
ConvertTo-Json -Depth 3 |
ConvertFrom-Json |
Select -ExpandProperty SyncRoot |
Select Week -ExpandProperty participants |
Select -Unique Name, age
# Results
<#
name age
---- ---
user A 35
user B 16
user C 42
#>
现在,在转换回has表之前,将地址和星期返回到列表中是另一回事,因为这在最终的Select语句中不可用
最后,如果可以得到所需的结果,那么不使用循环的原因是什么?从我迄今为止的实验来看,这是一件简单得多的事情,与我迄今为止的尝试和我在这里发布的内容相比
更新
好吧,我想这是给你的。我真的不知道为什么在我最初的帖子中我没有想到,尤其是当使用组对象给了我第一个线索时
# Convert JSON and use Sort unique to work with data
Clear-Host
$HasheTableExport |
ConvertTo-Json -Depth 3 |
ConvertFrom-Json |
Select -ExpandProperty SyncRoot |
Select Week -ExpandProperty participants |
Sort-Object -Property name -Unique
<#
# Results
name age address week
---- --- ------- ----
user A 35 city A 2020-05
user B 16 city B 2020-05
user C 42 city B 2020-04
#>
# View as JSON
Clear-Host
$HasheTableExport |
ConvertTo-Json -Depth 3 |
ConvertFrom-Json |
Select -ExpandProperty SyncRoot |
Select Week -ExpandProperty participants |
Sort-Object -Property name -Unique |
ConvertTo-Json
# Results
<#
[
{
"name": "user A",
"age": 35,
"address": "city A",
"week": "2020-05"
},
{
"name": "user B",
"age": 16,
"address": "city B",
"week": "2020-05"
},
{
"name": "user C",
"age": 42,
"address": "city B",
"week": "2020-04"
}
]
#>
然后根据需要利用/转换。感谢您的快速回复。给你一个简单的背景:我要求提供另一种解决方案,因为我认为它可能更有效,因为它可以利用Powershell的内置功能。关于名称:试着将其视为我们每天收到的数据的主键——而更改地址仅仅意味着,从一周到下一周都有更新。因此,我们希望有一个所有用户在所有星期的名单-与最新的数据,我们为他们有,但感谢你的答复-这已经帮助了很多-现在我只需要找出如何检索最新的行,如果有重复的名字没有担心。由于用例的普遍兴趣,我仍在研究它,看看我是否能完全解决它。如果你这样做了,在其他人之前,一定要更新,让所有人都从中受益。