数据库结果集后的缓慢数组操作
Slow array operations after DB resultset
我需要帮助优化我的 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
) 我得到了重复的教师行,唯一的区别是他们在 class ("Klasse/Klassen") 上课。
为了最小化输出,我检查第一个 GUID 是否与第二个相同,然后脚本将第二个 class 附加到第一个。所以 $sorted
数组只有一行,每个老师用逗号分隔的字符串显示所有 classes.
$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
)非常慢。
如果有任何优化脚本的想法,我将不胜感激。
也许这样的事情会奏效:
$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" 属性 替换为包含该组中所有对象的值数组的新表,以及 select第一个结果。
如果 $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
}}
}
我需要帮助优化我的 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
) 我得到了重复的教师行,唯一的区别是他们在 class ("Klasse/Klassen") 上课。
为了最小化输出,我检查第一个 GUID 是否与第二个相同,然后脚本将第二个 class 附加到第一个。所以 $sorted
数组只有一行,每个老师用逗号分隔的字符串显示所有 classes.
$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
)非常慢。
如果有任何优化脚本的想法,我将不胜感激。
也许这样的事情会奏效:
$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" 属性 替换为包含该组中所有对象的值数组的新表,以及 select第一个结果。
如果 $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
}}
}