gpt4 book ai didi

powershell - 通过Powershell中的键匹配两个大型对象阵列的最快方法

转载 作者:行者123 更新时间:2023-12-03 00:47:00 26 4
gpt4 key购买 nike

我有两个通过Import-CSV生成的对象的Powershell数组,我必须通过它们的属性之一对其进行匹配。具体来说,这是1:n的关系,所以目前我正在遵循以下模式:

foreach ($line in $array1) {
$match=$array2 | where {$_.key -eq $line.key} # could be 1 or n results
...# process here the 1 to n lines
}

,这不是很有效(两个表都有很多列),并且花费的时间对于我们的需求是无法接受的。有没有最快的方式进行这场比赛?

这两个数据源均来自csv文件,因此也欢迎使用某些内容代替Import-CSV。
谢谢

最佳答案

标准方法是使用哈希表(或其他语言的字典/ map )为数据建立索引。

function buildIndex($csv, [string]$keyName) {
$index = @{}
foreach ($row in $csv) {
$key = $row.($keyName)
$data = $index[$key]
if ($data -is [Collections.ArrayList]) {
$data.add($row) >$null
} elseif ($data) {
$index[$key] = [Collections.ArrayList]@($data, $row)
} else {
$index[$key] = $row
}
}
$index
}
$csv1 = Import-Csv 'r:\1.csv'
$csv2 = Import-Csv 'r:\2.csv'

$index2 = buildIndex $csv2, 'key'

foreach ($row in $csv1) {
$matchedInCsv2 = $index2[$row.key]
foreach ($row2 in $matchedInCsv2) {
# ........
}
}

另外,如果您需要提高速度并迭代大集合,请避免 |流水线,因为它比foreach / while / do语句要慢很多倍。并且不要在代码中使用带有 where {$_.key -eq $line.key}之类的ScriptBlock的任何东西,因为与内部简单代码相比,创建执行上下文会增加可笑的开销。

关于powershell - 通过Powershell中的键匹配两个大型对象阵列的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com