在关键/值对中拆分hastable

Adi*_*ilZ 2 powershell hash split hashtable

如何从特定键/值对开始拆分哈希表?

我有以下哈希表,只是更长:

Name               Value
----               -----
Name               Alpha
Age                    2
Position           Trick
Start date      01-01-31
End date         Unknown
Name               Corax
Age                   21
Position           Sneak
Earnings          40'000
End Date         Unknown
Name               Horus
Age                   22
Position            Dead
Why               Heresy
End date        03-30-30

我尝试Group-Object但失败了.

我特别想把它与名字分开,除名字,年龄和位置之外的一切都不一致.

我的实际问题是我想在为什么 = 异端时解析名称年龄的哈希表,不幸的是,数据的原始来源是字符串列表,这就是我将其转换为哈希表的原因.

bri*_*ist 5

Hashtables没有订购,因此您不能依赖"之前"和"之后"的概念.如果您知道一组完整密钥的特定名称,那么您可以遍历哈希表并构建两个新密钥,因此如果您希望一个哈希表包含名称,年龄和位置,另一个哈希表包含其他所有内容,你可以这样做:

$New1 = @{}
$New2 = @{}

$KeysGroup1 = @('Name','Age','Position') # This could just be one value

$MyHashTable.GetEnumerator().ForEach({
    if ($_.Key -in $KeysGroup1) {
        $New1[$_.Key] = $_.Value
    } else {
        $New2[$_.Key] = $_.Value
    }
})
Run Code Online (Sandbox Code Playgroud)

如果订单对您很重要,您可以使用有序字典.您可以使用快捷方式通过在文字哈希表前加上[ordered]类型加速器来创建文字有序字典:

$myOrdered = [ordered]@{ a = 1; z = 5; g = 2 }
Run Code Online (Sandbox Code Playgroud)

从那里你可以做一个类似于上面的方法依赖于订单.

要创建不基于文字的有序字典:

$myOrdered = New-Object System.Collections.Specialized.OrderedDictionary

# or in PowerShell v5

$myOrdered = [System.Collections.Specialized.OrderedDictionary]::new()

$myOrdered.Add('key','value')
Run Code Online (Sandbox Code Playgroud)

根据评论进行编辑

这听起来更像是一个散列表数组,你现在想要过滤这些.

一个[hashtable]can(并且经常)用作一种原型对象,它可能非常有用,因为它通常支持相同的语法,并且它具有内置的文字支持.

但是你开始遇到它们的极限,此时我认为你想要处理一组对象而不是一个哈希表数组.

幸运的是,有很简单的方法可以直接从散列表中创建PowerShell中的对象:

$obj = New-Object -TypeName PSObject -Property $myHash
$obj = [PSCustomObject]$myHash

$objArray = $myHashArray.ForEach({[PSCustomObject]$myHash})
Run Code Online (Sandbox Code Playgroud)

一旦你得到了你的对象数组,真正的乐趣就开始了:

$heretics = $objArray.Where({$_.Why -eq 'Heresy'})
Run Code Online (Sandbox Code Playgroud)

你会注意到我甚至没有在这里过滤掉其他属性.你不应该,直到你真的需要.然后,您可以使用Select-Object或只访问您需要的属性.因此,出于显示目的,您可能会这样做:

$heretics | Format-Table Name,Age
Run Code Online (Sandbox Code Playgroud)

你可以用一个你不能使用哈希表的对象做更多的事情,比如添加特殊类型的属性:

$objArray | Add-Member -MemberType ScriptProperty -Name IsHeretic -Value { $this.Why -eq 'Heresy' } -Force

$heretics = $objArray.Where({$_.IsHeretic})
Run Code Online (Sandbox Code Playgroud)