2016-08-01 36 views
1

我有自定義對象的數組:更新對象數組過多次迭代

$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 
} 

請注意,我並沒有在過去的兩個屬性設置的值。我這樣做的原因是因爲我試圖創建一個矩陣,我很容易就能看到這些是空白的(儘管如果必須的話,我可以將它們設置爲=「」)。

然後,我想遍歷第二個數據集並在導出最終報告之前更新這個數組中的這些值。例如。 (該位是相當多的僞代碼,因爲我不知道如何做到這一點:

$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 
    } 
} 

我猜這最後一點,我可能需要我的if語句返回一個索引,然後使用該索引更新對象但我在這個階段很迷茫

爲了清楚起見,這是一個簡化的例子,然後我需要通過第二個包含僱員ID的文件,實際上我有大約10個屬性需要更新來自不同數據源的所有數據源,並且數據源包含不同的人員列表,但有一些重疊。因此會有多次迭代。我該怎麼做?

回答

0

我會遍歷$phonelist兩次。第一次,你可以過濾所有手機實體,其中名稱是您$myList,並創建所需的對象:

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

你過濾所有手機實體,其中名稱不$myList並創建新的對象第二次:

$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

我會讀取phonelist.csv到散列表,例如像這樣:

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

,並在創建它使用哈希表中$report的電話號碼填:

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

您仍然可以檢查手機列表中沒有的,如報表項目這:

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

請參閱有問題的添加的詳細信息。我仍然認爲這會起作用,我會嘗試一下並讓你知道。但在此期間,如果您認爲有更好的方式來完成這項工作,請提供詳細信息,請告訴我。 –

+1

我會對所有數據使用相同的方法。選擇一個可以充當查找鍵的獨特屬性。使用唯一屬性作爲關鍵字將所有附加數據加載到哈希表中。生成報告並在生成時通過散列表查找來填充屬性。可能需要進行一些混合和匹配,具體取決於實際數據的樣子,但這是一般方法。 –