在PowerShell中从Excel电子表格中选择每组前2行时,如何优化性能



我需要为每个唯一的代理ID选择前X行。下面的方法有效,但当电子表格有超过5k的结果需要考虑时,它会遇到性能问题。我希望你们这些非常聪明的人能帮助我优化方法,减少处理量。

我使用ImportExcel导入调用记录的电子表格,然后过滤掉不感兴趣的行,剩下$UsableCalls作为我要评估的调用池。有时,这个游泳池只有2k行。有时它有16k。它可能会有更多。不幸的是,这种方法所能支持的最大结果似乎是5kish左右。任何超过这一点的事情,整个过程都悬而未决。所以,如果我有5千排,那么我真的只能处理每个代理的前1个电话。如果我有2k,那么我可以得到每个代理的前2个电话。每个代理的呼叫数量是可选的,我希望每个代理最多可以选择前5个呼叫,但这根本不适用于目前的处理方式。

最终,目标是为每个代理选择第一个X#调用(行(。然后我将其导出为第二个电子表格。这是我唯一能想到的方法,但我当然愿意接受建议。

以下是我所拥有的,我该如何改进?

# this custom function allows the user to select a digit, uses wpf messagebox
$numberagent = select-numberperagent  
# collect the unique agent IDs
$UniqueAgentIDs = @()
$UniqueAgentIDs += ($UsableCalls | Select-Object -Property "Agent ID" -Unique )."Agent ID"
# select first X# of each agent's calls
$CallsPerAgent = @()
foreach ($UniqueAgent in $UniqueAgentIDs) {
$CallsPerAgent += ($UsableCalls | ? {$_."Agent ID" -eq "$UniqueAgent"}) | select -First $numberagent
} #close foreach uniqueagent

下面是变量$usableCalls:中一个自定义PS对象的示例

PS C:> $usableCalls[0]
DateTime    : 2022-03-03 11:06:16.063
DigitDialed : 781
Agent ID    : 261
Agent Name  : CCM
Skill group : PAYE.
CallType    : PAYE
PPSN        : 81
DNIS        : 10
ANI         : 772606677789
Disposition : Handled
Duration    : 818
RingTime    : 12
DelayTime   : 0
HoldTime    : 0
TalkTime    : 14
WorkTime    : 31

提高速度的第一件事是不使用+=向数组添加内容
这样,每次添加时,整个数组都需要在内存中重建。最好让PowerShell为您收集数据:

# collect the unique agent IDs
$UniqueAgentIDs = ($UsableCalls | Select-Object -Property 'Agent ID' -Unique).'Agent ID'
# select first X# of each agent's calls
$CallsPerAgent = foreach ($UniqueAgent in $UniqueAgentIDs) {
$UsableCalls | Where-Object {$_.'Agent ID' -eq $UniqueAgent} | Select-Object -First $numberagent
}

在不真正知道变量$UsableCalls中有什么对象的情况下,您甚至可以使用Group-Object对Agent ID中的所有调用进行分组,并在这些组上循环

$CallsPerAgent = $UsableCalls | Group-Object -Property 'Agent ID' | ForEach-Object {
$_.Group | Select-Object -First $numberagent
}

相关内容

  • 没有找到相关文章

最新更新