2016-08-01 15 views
1

Ich habe ein Array von benutzerdefinierten Objekte:Update-Objektarray über mehrere Iterationen

$report = @() 

foreach ($person in $mylist) 
{ 
    $objPerson = New-Object System.Object 

    $objPerson | Add-Member -MemberType NoteProperty -Name Name -Value $person.Name 
    $objPerson | Add-Member -MemberType NoteProperty -Name EmployeeID 
    $objPerson | Add-Member -MemberType NoteProperty -Name PhoneNumber 

    $report += $objPerson 
} 

Bitte beachte, dass ich keine Werte für die letzten beiden Eigenschaften festgelegt haben. Der Grund, warum ich das getan habe, ist, weil ich versuche, eine Matrix zu erstellen, in der ich leicht sehen kann, wo diese Leerstellen sind (obwohl ich sie einfach auf = setzen könnte, wenn ich muss).

Dann möchte ich ein zweites Dataset durchlaufen und diese Werte in diesem Array aktualisieren, bevor ich den endgültigen Bericht exportiert habe. Z.B. (Das Bit ist so ziemlich Pseudo-Code wie ich keine Ahnung, wie es zu tun:

$phonelist = Import-Csv .\phonelist.csv 

foreach ($entry in $phonelist) 
{ 
    $name = $entry.Name 
    if ($report.Contains(Name)) 
    { 
    # update the PhoneNumber property of that specific object in the array with 
    # another value pulled out of this second CSV 
    } 
    else 
    { 
    # Create a new object and add it to the report - don't worry I've already got 
    # a function for this 
    } 
} 

Ich bin für dieses letzte Stück Erraten ich wahrscheinlich mein brauche if-Anweisung einen Index zurück, und dann diesen Index verwenden, um update das Objekt, aber ich bin ziemlich verloren in diesem Stadium.

Aus Gründen der Klarheit ist dies ein vereinfachtes Beispiel.Danach muss ich eine zweite Datei mit den Mitarbeiter-IDs gehen, und in Wirklichkeit habe ich etwa 10 Eigenschaften, die Alle Daten müssen aus verschiedenen Datenquellen aktualisiert werden, und die Datenquellen enthalten unterschiedliche Personenlisten, jedoch mit einigen Überlappungen, so dass es mehrere Iterationen gibt.

Wie mache ich das?

Antwort

0

Ich würde zweimal über die $phonelist iterieren. Das erste Mal, können Sie alle Telefongesellschaften filtern, wo der Name in Ihrem $myList ist und erstellen Sie das gewünschte Objekt:

$phonelist = import-cse .\phonelist.csv 
$report = $phonelist | Where Name -in ($mylist | select Name) | Foreach-Object { 
    [PSCustomObject]@{ 
     Name = $_.Name 
     PhoneNumber = $_.PhoneNumber 
     EmployeeID = '' 
    } 
} 

Das zweite Mal, wenn Sie alle Telefongesellschaften filtern, wo der Name nicht in $myList ist und erstellen Sie das neue Objekt :

$report += $phonelist | Where Name -NotIn ($mylist | select Name) | Foreach-Object { 
    #Create a new object and add it to the report - don't worry I've already got a function for this 
} 
2

I phonelist.csv in eine Hash-Tabelle lesen würde, zB wie folgt aus:

$phonelist = @{} 
Import-Csv .\phonelist.csv | ForEach-Object { $phonelist[$_.name] = $_.number } 

und dass die Hash-Tabelle verwenden, um in den Telefonnummern in $report füllen, wie Sie es schaffen:

$report = foreach ($person in $mylist) { 
    New-Object -Type PSObject -Property @{ 
    Name  = $person.Name 
    EmployeeID = $null 
    PhoneNumber = $phonelist[$person.Name] 
    } 
} 

Sie noch die Telefonliste für Einträge überprüfen, die nicht im Bericht sind wie dies:

Compare-Object $report.Name ([array]$phonelist.Keys) | 
    Where-Object { $_.SideIndicator -eq '=>' } | 
    Select-Object -Expand InputObject 
+0

Bitte siehe hinzugefügt Detail in Frage. Ich denke immer noch, das wird funktionieren, ich werde es ausprobieren und Sie wissen lassen. Aber in der Zwischenzeit, wenn Sie denken, dass es einen besseren Weg gibt, es angesichts der zusätzlichen Details zu tun, lassen Sie es mich bitte wissen. –

+1

Ich würde den gleichen Ansatz für alle Daten verwenden. Wählen Sie ein eindeutiges Attribut aus, das als Suchschlüssel dienen kann. Laden Sie alle zusätzlichen Daten in Hashtabellen, indem Sie das eindeutige Attribut als Schlüssel verwenden. Generieren Sie Ihren Bericht und füllen Sie die Eigenschaften über Hashtabellen, während Sie sie generieren. Je nachdem, wie Ihre tatsächlichen Daten aussehen, ist ein gewisses Maß an Mischen und Anpassen erforderlich. Dies ist jedoch der allgemeine Ansatz. –