Link to home
Start Free TrialLog in
Avatar of mikeydk
mikeydkFlag for Denmark

asked on

Powershell find unique value

Powershell

I have an array of the following PSObject:

$object = New-Object -TypeName PsObject
$object | Add-Member –MemberType NoteProperty –Name firstName –Value $_.firstname
$object | Add-Member –MemberType NoteProperty –Name SSO –Value $_.CPR
$object | Add-Member –MemberType NoteProperty –Name WorkContract –Value $_.WorkContract
$object | Add-Member –MemberType NoteProperty –Name numerator –Value $_.numerator
$object | Add-Member –MemberType NoteProperty –Name entryDate –Value $_.entryDate

For example:

Firstname: John
SSO: 111111
Workcontract: 00
Enumerator: 50
EntryDate: 31-02-2008

Firstname: John
SSO: 111111
Workcontract: 02
Enumerator: 67
EntryDate: 31-02-2009

Firstname: Joe
SSO: 222222
Workcontract: 08
Enumerator: 45
EntryDate: 31-02-2001

I need to be able to return only one PSObject per SSO. (create an array only containing unique SSO)
Based on priority:
1.      Workcontract: (lowest first (eg. 00)) (if equal - priority 2)
2.      Enumerator: (higest number) (if equal - priority 3)
3.      EntryDate:  (oldest date first)

Hope I make my self clear ;)

Mike
ASKER CERTIFIED SOLUTION
Avatar of oBdA
oBdA

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of mikeydk

ASKER

oBdA> Thanks ;)

Any cool way to ignore an error in  line "@{Expression={[DateTime]::ParseExact($_.EntryDate, "dd'-'MM'-'yyyy", $Null)}; Descending=$false}" if $_.EntryDate is empty or null?

Thanks in advance
Avatar of oBdA
oBdA

Well, how it's supposed to be sorted in this case (very old - high priority, very far in the future - low priority)?
Avatar of mikeydk

ASKER

High priority ;)
$Objects | Group-Object -Property SSO | ForEach-Object {
	$_.Group | Sort-Object -Property `
		@{Expression={$_.Workcontract}; Descending=$false},
		@{Expression={[UInt64]$_.Enumerator}; Descending=$true},
		@{Expression={Try {[DateTime]::ParseExact($_.EntryDate, "dd'-'MM'-'yyyy", $Null)} Catch {[DateTime]::MinValue}}; Descending=$false} |
	Select-Object -First 1
}

Open in new window