我需要为每个唯一的代理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
}