数据库结果集后阵列操作缓慢

时间:2018-08-27 08:18:16

标签: arrays powershell hashtable

我需要优化PowerShell脚本的帮助。

$sorted = @()
$firsttime = 0
$j = 0
$zaehler = $results.Count-1

for ($i=0; $i -le $results.Count-1; $i++) {
    $j = $i+1
    while ($results.GUID[$i] -eq $results.GUID[$j]) {
        $klassen = ""
        $rec = $results | where {$_.GUID -eq $results.GUID[$i]}

        if ($firsttime -eq 0 -or !$sorted.GUID.contains($rec[0].GUID)) {
            $firsttime = 1
            foreach ($item in $rec.Klasse) {
                if ($klassen -eq "") {
                    $klassen += $item
                } else {
                    if (!$klassen.Contains($item)) {
                        $klassen += "," + $item
                    }
                }
            }
            $rec[0].Klasse = $klassen
            $sorted += $rec[0]
        }
        $j = $j+1
    }
    Write-Host ($i/$zaehler).ToString("P") "von Schule" $schule
}
if (!$sorted) {
    $results
} else {
    $sorted
}

基本上,在我的结果集中($results)中,我得到了重复的教师行,唯一的区别是他们正在教的课程(“ Klasse / Klassen”)。 为了最小化输出,我正在检查第一个GUID是否与第二个GUID相同,然后脚本将第二个类附加到第一个。因此,$sorted数组的每个教师只有一行,并用逗号分隔的字符串来显示所有课程。

$results的示例行:

@{
    GUID={1234567-1234-1234-1234-1234567}; 
    userrole=teacher;
    Vorname=Max;
    Nachname=Mustermann;
    Geburtstag=01.01.2000;
    Klasse=9A; 
    Schule=123456
}
@{
    GUID={1234567-1234-1234-1234-1234567};
    userrole=teacher;
    Vorname=Max;
    Nachname=Mustermann;
    Geburtstag=01.01.2000;
    Klasse=9B; 
    Schule=123456
}

$sorted[0]的示例行:

@{
    GUID={1234567-1234-1234-1234-1234567};
    userrole=teacher;
    Vorname=Max;
    Nachname=Mustermann;
    Geburtstag=01.01.2000;
    Klasse=9A,9B,9C,5A;
    Schule=123456
}

排序过程(检查是否包含foreach $item,添加到$klassen)非常慢。

对于如何优化脚本的任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

也许这样可以工作:

$results | ForEach-Object {
    New-Object -Type PSObject -Property $_
} | Group-Object GUID | ForEach-Object {
    $teacher = $_.Group
    $teacher | Select-Object -First 1 -Exclude Klasse -Property *, @{n='Klasse';e={
        $teacher | Select-Object -Expand Klasse
    }}
}

将哈希表转换为自定义对象,按GUID将其分组,然后用新的哈希表替换原始的“ Klasse”属性,其中包含该组中所有对象的值数组,然后选择第一个结果。

应该{​​{1}}已经是对象列表,您可以跳过第一个$results

ForEach-Object