Медленные операции с массивами после набора результатов БД - PullRequest
0 голосов
/ 27 августа 2018

Мне нужна помощь в оптимизации моего скрипта 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 со вторым, а затем сценарий добавляет второй класс к первому.Таким образом, массив $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 голосов
/ 27 августа 2018

Может быть, что-то вроде этого будет работать:

$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" на новое, содержащее массив значений извсе объекты в этой группе и выберите первый результат.

Если $results уже является списком объектов, вы можете пропустить первый ForEach-Object:

$results | Group-Object GUID | ForEach-Object {
    $teacher = $_.Group
    $teacher | Select-Object -First 1 -Exclude Klasse -Property *, @{n='Klasse';e={
        $teacher | Select-Object -Expand Klasse
    }}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...