Mit Powershell nur bestimmte Arrayfelder durchsuchen (Performance)
Hallo zusammen,
ich möchte größere Arrays durchsuchen.
Dafür reicht es mir eus, nur ein bestimmtes Feld zu vergleichen. Das sollte die Performance doch in die Höhe treiben, oder?
Es scheint so, als ob die
Variante, die schnellste ist, mit der man Arrays (und in meinem Fall sind das Multinensionlae Arrays) durchsuchen kann.
Hier ein Beispielcode:
Wie kann ich nun NUR das Feld "Start" des gesamten Arrays anzeigen lassen bzw. mit einem anderen Wert vergleichen?
Wie bereits gesagt - das "foreach" ist scheinbar die schnellste Methode durch ein Array zu gehen, oder?
Danke für jeden Hinweis bzw. Code.
Feuerstein08
ich möchte größere Arrays durchsuchen.
Dafür reicht es mir eus, nur ein bestimmtes Feld zu vergleichen. Das sollte die Performance doch in die Höhe treiben, oder?
Es scheint so, als ob die
foreach ($element in $array) ($element}
Variante, die schnellste ist, mit der man Arrays (und in meinem Fall sind das Multinensionlae Arrays) durchsuchen kann.
Hier ein Beispielcode:
cls
$myMultiArray = @()
$myMultiArray += @{
"Start" = "10";
"End" = "24";
"Finish" = "29"}
$myMultiArray += @{
"Start" = "15";
"End" = "26";
"Finish" = "34"}
$myMultiArray += @{
"Start" = "5";
"End" = "11";
"Finish" = "16"}
Write-Host
foreach ($element in $myMultiArray) {
if ($($element).Start.length -gt 0) {$element}
}
Wie kann ich nun NUR das Feld "Start" des gesamten Arrays anzeigen lassen bzw. mit einem anderen Wert vergleichen?
Wie bereits gesagt - das "foreach" ist scheinbar die schnellste Methode durch ein Array zu gehen, oder?
Danke für jeden Hinweis bzw. Code.
Feuerstein08
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 141726
Url: https://administrator.de/forum/mit-powershell-nur-bestimmte-arrayfelder-durchsuchen-performance-141726.html
Ausgedruckt am: 22.04.2025 um 12:04 Uhr
7 Kommentare
Neuester Kommentar

Hallo Feuerstein08,
deine Syntax erzeugt kein Mutliarray sonder eine HashTable.
Am günstigsten wäre wohl eine Object-Variable, dann könntest du einfach mit
(BTW: soll die Abfrage oben wirklich die Länge von Start abfragen?)
Ich habe aber selber noch Schwierigkeiten an eine selbst erzeugte Object-Variable Zeilen anzuhängen.
Das Erzeugen ginge so:
Ich weiss ja nicht wo deine Daten herkommen, wenn du sie in eine csv verpacken kannst,
nimm einfach import-csv, dann kannst du mit select where foreach etc arbeiten.
Gruß
LotPings
Edit: where verbessert
deine Syntax erzeugt kein Mutliarray sonder eine HashTable.
Am günstigsten wäre wohl eine Object-Variable, dann könntest du einfach mit
where-object [$_.Start -gt 0}
selektieren(BTW: soll die Abfrage oben wirklich die Länge von Start abfragen?)
Ich habe aber selber noch Schwierigkeiten an eine selbst erzeugte Object-Variable Zeilen anzuhängen.
Das Erzeugen ginge so:
$oVar= New-Object psobject
$oVar| Add-Member -MemberType noteProperty -Name Start -Value 10
$oVar| Add-Member -MemberType noteProperty -Name End -Value 24
$oVar| Add-Member -MemberType noteProperty -Name Finish -Value 29
$oof
Ich weiss ja nicht wo deine Daten herkommen, wenn du sie in eine csv verpacken kannst,
nimm einfach import-csv, dann kannst du mit select where foreach etc arbeiten.
Gruß
LotPings
Edit: where verbessert
Hallo
erzeugt ein Array, die weiteren Zeilen erzeugen Hash-tables als einzelne Arrayelemente. Ob das jetzt ein Multidimensionales Array ist, darüber kann man sich streiten.
grüße Torsten
edit:
hier noch zwei links zu array in PS ss64.com und powershell.com
$myMultiArray = @()
erzeugt ein Array, die weiteren Zeilen erzeugen Hash-tables als einzelne Arrayelemente. Ob das jetzt ein Multidimensionales Array ist, darüber kann man sich streiten.
Wie kann ich nun NUR das Feld "Start" des gesamten Arrays anzeigen lassen bzw. mit einem anderen Wert vergleichen?
so würde erstmal das anzeigen aussehenfor ($x = 0 ; $x -le $myMultiArray.count - 1 ; $x++) { Write-host 'Start:' $myMultiArray[$x] }
grüße Torsten
edit:
hier noch zwei links zu array in PS ss64.com und powershell.com

Zitat von @Feuerstein08:
Die Daten liegen in den unterschiedlichsten Formaten vor. Die zu vergleichende Datei ist eine XLSM Datei. Die vorher in eine CSV
umzuwandeln bringt nichts, da ich ja den Inhalt mehrerer Dateien mit diesem Inhalt vergeleichen und ggf. etwas verändern,
oder anhängen möchte - daher der Weg über das Array.
Nun ja, IMO das hat dann aber auch gar nichts mit deinem obigen Beispiel zu tun.Die Daten liegen in den unterschiedlichsten Formaten vor. Die zu vergleichende Datei ist eine XLSM Datei. Die vorher in eine CSV
umzuwandeln bringt nichts, da ich ja den Inhalt mehrerer Dateien mit diesem Inhalt vergeleichen und ggf. etwas verändern,
oder anhängen möchte - daher der Weg über das Array.
Für die Excel Datei kannst du den csv export von Powershell aus automatisieren,
wenn du die csv eingelesen hast liegen die Daten als sortier- und selektierbare Spalten vor.
Angenommen deine Exceltabelle sieht so aus:
Start | End | Finish |
---|---|---|
10 | 24 | 29 |
15 | 26 | 34 |
5 | 11 | 16 |
# PS xls -> csv
$xls="D:\test\Posh\test.xlt"
$csv="D:\test\Posh\mytest.csv"
$xl=New-Object -com "Excel.Application"
$wb=$xl.workbooks.open($xls)
$wb.SaveAs($csv,6)
$xl.displayalerts=$False
$xl.quit()
$Daten = import-csv -Delimiter ";" $csv
$Daten|ft -auto
$Daten | where {[int]$_.Start -gt 5} |ft -Auto
$Daten | ?{[int]$_.Start -gt 5} | Select Start | ft -Auto
Start End Finish
----- --- ------
10 24 29
15 26 34
5 11 16
Start End Finish
----- --- ------
10 24 29
15 26 34
Start
-----
10
15
Gruß
LotPings
Edit: In Zeile 17 ist ist das "< ft -auto" natürlich witzlos war vom kopieren übrig geblieben

Zitat von @Feuerstein08:
bei mir kommen da Fehler raus. Liegt wahrscheinlich an der 2007'er Excel Version, oder?
Ich habs mit 2010 Beta probiert hab aber zum test aus Versehen als 2010er .xltbei mir kommen da Fehler raus. Liegt wahrscheinlich an der 2007'er Excel Version, oder?
Muss ich später bei einer XLSM noch etwas ändern?
Ich habs gerade noch einmal probiert mit xlsm im kompatiblen Format ohne ProblemeGruß
LotPings