em-pie
Goto Top

Powershell: Gruppieren von Objekten mit mehreren Parametern

Guten Morgen zusammen,

ich benötige mal eure Unterstützung beim Gruppieren von Objekten in der Powershell

Ausgangslage ist ein Objekt $myObject mit folgendem Beispielinhalt (Daten viel umfangreicher):
Erhebungstag Land         Stadt  Straße      männlich  weiblich  kinder erwachsene
---------------------------------------------------------------------------------------------
07.12.2022   Deutschland  Köln   Amselweg     5         7          3      9
08.12.2022   Deutschland  Köln   Amselweg     5         7          3      9
07.12.2022   Deutschland  Köln   Rheinallee  15        17         17      15
08.12.2022   Deutschland  Köln   Rheinallee  25         7         10      22

Jetzt möchte ich nach Erhebungstag, Land und Stadt gruppieren und die Spalten männlich, weiblich, kinder und erwachsene summieren, sodass das Ergebnis am Ende wie folgt aussehen sollte:

Erhebungstag Land         Stadt  männlich  weiblich  kinder erwachsene
---------------------------------------------------------------------------------------------
07.12.2022   Deutschland  Köln   20        24        20     24
08.12.2022   Deutschland  Köln   30        14        13     31

Jetzt hab ich mit Visual Code und der PS 7 folgendes funktionsfähig:
$myObject | 
        Group-Object -Property Erhebungstag, Land, Stadt| 
        Select-Object  @{Name='Land'; Expression={$_.Group.Land}},  
            @{Name='Stadt'; Expression={$_.Group.Stadt}},  
            @{Name='Erhebungstag'; Expression={$_.Group.Erhebungstag}},  
            @{Name='männlich '; Expression={($_.Group.männlich | Measure-Object -Sum).Sum }},  
            @{Name='weiblich'; Expression={($_.Group.weiblich | Measure-Object -Sum).Sum }},  
            @{Name='kinder'; Expression={($_.Group.kinder | Measure-Object -Sum).Sum }},  
            @{Name='erwachsene'; Expression={($_.Group.erwachsene | Measure-Object -Sum).Sum }}  

Der Task, der das Script am Ende ausführt, hat aber nur die PS 5 zur Verfügung und kommt mit den Zeilen 3-5 nicht klar und haut mir dann folgendes Ergebnis raus.
Erhebungstag Land         Stadt  männlich  weiblich  kinder erwachsene
---------------------------------------------------------------------------------------------
07.12.2022   Deutschland  Köln   50        38        33     55

Ich habs auch schonmal mit
@{Name='Erhebungstag'; Expression={$_.Values[2]}},  
versucht, klappt aber auch nicht.

Edit: ebensowenig klappte:
... 
@{Name='Erhebungstag'; Expression={$_.Erhebungstag}},  
...
oder
... Erhebungstag,
... 


Und natürlich hab ich das WWW schon bemüht, aber scheinbar nur das falsche gesucht oder einfach zu doof dazu (will ich nicht ausschließen face-wink)
Hier hab ich Beispielsweise etwas mit einem foreach() gefunden, kann mir aber nur bedingt vorstellen, dass ich es "so kompliziert" machen muss.


Habt ihr eine Idee/ Lösung/ Ansatz oder könnt mir aufzeigen, wo mein Knoten im Kopf gerade ist?

Schon mal besten Dank
Gruß
em-pie

Content-ID: 4902270468

Url: https://administrator.de/contentid/4902270468

Ausgedruckt am: 17.11.2024 um 07:11 Uhr

TK1987
Lösung TK1987 09.12.2022 um 09:50:38 Uhr
Goto Top
Moin,

Zitat von @em-pie:
Der Task, der das Script am Ende ausführt, hat aber nur die PS 5 zur Verfügung und kommt mit den Zeilen 3-5 nicht klar und haut mir dann folgendes Ergebnis raus.
kann ich so nicht bestätigen, bei mir funktioniert das problemlos
PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  1682

PS C:\> @'
Erhebungstag;Land;Stadt;Straße;männlich;weiblich;kinder;erwachsene
07.12.2022;Deutschland;Köln;Amselweg;5;7;3;9
08.12.2022;Deutschland;Köln;Amselweg;5;7;3;9
07.12.2022;Deutschland;Köln;Rheinallee;15;17;17;15
08.12.2022;Deutschland;Köln;Rheinallee;25;7;10;22
'@|ConvertFrom-CSV -Delimiter ';'|Group-Object -Property Erhebungstag, Land, Stadt| 
  Select-Object  @{Name='Land'; Expression={$_.Group.Land}},
    @{Name='Stadt'; Expression={$_.Group.Stadt}},
    @{Name='Erhebungstag'; Expression={$_.Group.Erhebungstag}},
    @{Name='männlich '; Expression={($_.Group.männlich | Measure-Object -Sum).Sum }},
    @{Name='weiblich'; Expression={($_.Group.weiblich | Measure-Object -Sum).Sum }},
    @{Name='kinder'; Expression={($_.Group.kinder | Measure-Object -Sum).Sum }},
    @{Name='erwachsene'; Expression={($_.Group.erwachsene | Measure-Object -Sum).Sum }}|Format-Table

Land        Stadt Erhebungstag männlich  weiblich kinder erwachsene
----        ----- ------------ --------- -------- ------ ----------
Deutschland Köln  07.12.2022          20       24     20         24
Deutschland Köln  08.12.2022          30       14     13         31

Vielleicht beim Import irgendetwas schief gelaufen?

Gruß Thomas
em-pie
em-pie 09.12.2022 um 10:04:20 Uhr
Goto Top
@TK1987
verrückt, das klappt.

Wenn der Import meines Objektes (eine CSV) aber per se krum ist, müsste die PS7 doch dann auch auf die Nase fallen!?


Ich teste das nochmal und versuche mal, in den ganzen Schritten davor mal etwas mehr Ausgabe einzubringen.
em-pie
em-pie 09.12.2022 um 11:34:23 Uhr
Goto Top
Moin,

Vielleicht beim Import irgendetwas schief gelaufen?
Tatsächlich war das das Problem.

Hintergrund:
Ich hab ein Excel-Dokument welches ich importiere. Die dortigen Daten werden nochmal verrechnet und sollten in eine Hashtable/ ein Array mit Objekten geschrieben werden.
Tatsächlich hab ich da aber Bockmist geschrieben, sodass mein vermeidliches Objekt zwar wie ein Objekt aussah, aber dann doch keines gewesen ist.
Nachdem ich das nun umgestellt hab, passt das.

Danke für den (entscheidenden) Tipp. Manchmal sieht man den Wald vor lauter Sträuchern nicht mehr...


Was mich aber wundert:
Sowohl PS7 als aus PS5 auf meinem Entwicklungssystem (Server 2016) haben das so mitgemacht. Lediglich der Zielserver (PS5, identische Version) hatte damit ein Problem.