【发布时间】:2021-06-17 06:26:23
【问题描述】:
我不经常提问(大多数时候问题可以通过一些研究来解决,对吧?)但我只是想听听您的意见,因为可能有更好的(更有效的方法)。
所以让我们看看,下面的代码运行良好,它达到了它的目的。代码的结果是哈希图的哈希图,我需要它作为另一项工作的查找表。
背景:
-
$ccDb是一个由大约 200k 项组成的数组,属性为companyCd, costCenterNbr, costCenterShortNm, costCenterLongDescr。 - 必须修剪每个属性(请不要让我修剪我的 Db,很遗憾我不能)。
-
costCenterNbr包含在companyCd上,意思是每个companyCd可以有多个costCenterNbr。 -
companyCd可以包含 X 个costCenterNbr。 -
costCenterNbr具有唯一值,companyCd也是如此。 -
costCenterShortNm和costCenterLongDescr与costCenterNbr相关
问题:
必须在每次运行我的脚本时构建此映射,因为信息是从 SQL 表中获取的(它一直在变化)。构建这张地图大约需要 15 分钟(在相当不错的服务器上,2CPU 12Cores)。
问题:
您是否看到可以改进此代码以更快/更有效地执行的方法?
$ccMap=@{}
foreach($line in $ccDb)
{
$companyCd=$line.companyCd.trim()
$costCenterNbr=$line.costCenterNbr.trim()
$costCenterShortNm=$line.CostCenterShortNm.trim()
$costCenterLongDescr=$line.CostCenterLongDescr.trim()
$coceMap=@{
$costCenterNbr=@{
shortDesc=$costCenterShortNm
longDesc=$costCenterLongDescr
}
}
if($ccMap.ContainsKey($companyCd))
{
$ccMap[$companyCd]+=$coceMap
}
else
{
$ccMap.Add($companyCd,$coceMap)
}
}
对于冗长的解释,我深表歉意,但我觉得最好预先提供最多的信息。很感谢任何形式的帮助。此外,我知道 PowerShell 对于我正在做的事情来说是一种非常糟糕的语言,而 C# 可能会更高效,但它就是这样。
编辑:添加测量值以供参考。
编辑:
非常感谢@Mathias R. Jessen,这是他的代码的测量结果。优秀的代码。
【问题讨论】:
-
您可以使用 -AsHashTable 开关查看 Group-Object。
-
听起来你在做经典的数据管理。经典的数据库管理系统 (DBMS) 非常适合这类事情。您的数据显然来自 SQL,所以我假设它来自 DBMS。为什么不在 SQL 中进行数据转换和缩减,然后将缩减后的数据传递给 Powershell?
-
是的,已经做到了,组对象要慢得多。
-
$ccDb中有很多重复的companyCd值吗? :-) -
您只是在使用 SQL 模块吗?您应该也可以让数据库为您修剪它
标签: powershell hashmap hashtable