Förbättra powershellscript, gruppering av attribut baserat på annat attribut

Permalänk
Medlem

Förbättra powershellscript, gruppering av attribut baserat på annat attribut

Vet faktiskt inte vad jag skulle skriva som rubrik vilket känns väldigt typiskt för det här problemet då kännedom om korrekta söktermer troligen skulle lösa det.

Jag håller på att skriva ett litet script som konsumerar en excelfil innehållandes ärendeidn och personnummer (cids), samt en del annat som är irrelevant för sammanhanget. Personnumren finns i ett av två fält, men aldrig i båda, och ett personnummer kan vara kopplat till flera ärendeidn men inte tvärtom. Jag vill få ut objekt som har ett personnummer och alla ärendeidn kopplade till det, samt en del ad-fält som hämtas utifrån personnumret.

Ett snuttifierat exempel är enligt nedan.

Exempeldata (i csv för att göra det enklare för forumet) jag använder är:

id,cid1,cid2 1,12, 2,,12 3,13,

Vad jag vill få ut är

cid,ids,namn 12,1-2,Nisse 13,3,Ulla

Jag får det att funka med följande, där ad-grejerna är utkommenterade eftersom jag inte har ad-koppling med denna dator

Import-Module ImportExcel $in = Import-Excel .\test.xlsx | Select-Object id,@{label="cid";e={($_.cid1+$_.cid2)}} $uniquecids = $in | Select-Object -ExpandProperty cid -Unique $out = @() foreach ($cid in $uniquecids) { #$user = get-aduser ... bla bla sökning baserat på cid $out += [PSCustomObject]@{ cid = $cid ids = ($in | Where-Object cid -eq $cid | Select-Object -ExpandProperty id) -join "-" #To get excel to not show System.Object #namn = $user.givenname } } return $out

Detta går fint att exportera till excel (vilket är syftet) men det känns som att det borde finnas ett finare sätt att komma åt ärendeids. Det är alltså specifikt

ids = ($in | Where-Object cid -eq $cid | Select-Object -ExpandProperty id) -join "-"

jag tänker mig borde gå att göra bättre. Jag har petat runt lite med Group-Object och försökt exportera som hashtable med tanken att jag t.ex. skulle kunna få fram alla ids kopplade till ett visst cid med t.ex.

$hash = $in | Group-Object cid -ashashtable

och sedan göra något i stil med

ids = $hash[$cid]

men får verkligen inte till det.

För mina syften så fungerar alltså redan allting men jag är specifikt ute efter en förbättring då jag misstänker att det går att göra bättre

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Inaktiv

Panga in hela excellen istället för att splitta kolumner alt. använd -headername

Kör en fuling och läs in Out på foreachloopen. Mycket bättre prestanda om det är stora filer.

$out = foreach ($cid in $uniquecids) {

#$user = get-aduser ... bla bla sökning baserat på cid

If (![string]::IsNullOrEmpty($in.<kolumn1>){
$ids = $in.<kolumn1>
} else {
$ids = $in.<kolumn2>
}

[PSCustomObject]@{
cid = $cid
ids = $ids
#namn = $user.givenname
}
}

Du får kika på prestandavinster och förluster med Measure-Command tills du är nöjd.

Edit #26: Kanske missförstod helt, sovdags!