2016-03-07 133 views
1

我試圖用PowerShell中一些重複的數據進行工作,並結合,我有一個數組兩個字段Peoplename和Sitelabel數據看起來像這樣PowerShell的重複數據,並結合

Peoplename  Sitelabel 
Bill Jones  SL1, SL2, SL3 
John Smith  SL1, SL2, SL4 
Claire Harris SL1, SL2, SL3   
Fran Goddard SL1, SL4, SL3   
John Smith  SL1, SL2, SL3, SL4, SL5 
Bill Jones  SL1, SL2, SL3 
John Smith  SL1, SL2, SL3 

我想結束了以下數據

People   Sitelabel 
Bill Jones  SL1, SL2, SL3, SL5, SL6, SL7 
John Smith  SL1, SL2, SL4, SL5 
Claire Harris SL1, SL2, SL3   
Fran Goddard SL1, SL4, SL3   

我用下面的代碼來識別重複的人

for([int] $i=0;$i -lt $People.Peoplename.count;$i++) 
{ 
    for([int] $j=$i+1;$j -lt $ People.Peoplename.count;$j++) 
    { 
     if($People [$i].Peoplename -eq $ People [$j].Peoplename) 
     { 
      write-host "Duplicate item found" $People [$i].Peoplename 
     } 

    } 
} 

但我掙扎於如何再檢查Sitelabel

希望任何建議/指導

+0

'$人物| Group-Object Peoplename' –

+0

謝謝Mathias,那正是我所需要的,不能相信我錯過了那一個 – user3716527

回答

1

注:該解決方案使用的cmdlet從PowerShell Community Extensions模塊。

您的數據與預期輸出不符。比如,比爾瓊斯沒有SL5,SL6和SL7。

不過,這是我會做的。

這是我如何設置數據。我不知道你是怎麼得到它:

$Data = @' 
"PeopleName","SiteLabel" 
"Bill Jones","SL1, SL2, SL3" 
"John Smith","SL1, SL2, SL4" 
"Claire Harris","SL1, SL2, SL3" 
"Fran Goddard","SL1, SL4, SL3" 
"John Smith","SL1, SL2, SL3, SL4, SL5" 
"Bill Jones","SL1, SL2, SL3" 
"John Smith","SL1, SL2, SL3" 
'@ 

$People = ConvertFrom-Csv $Data; 

這就是我如何處理它:

$PeopleCondensed = $People | Group-Object 'PeopleName' | ForEach-Object { 
    $_ | Select-Object @{n='PeopleName';e={$_.Name}}, @{n='SiteLabel';e={ ` 
     $_.Group ` 
      | Select-Object -ExpandProperty SiteLabel ` 
      | Join-String -Separator ',' ` 
      | Split-String -Separator ',' -RemoveEmptyStrings ` 
      | ForEach-Object { $_.Trim(); } ` 
      | Select-Object -Unique ` 
      | Sort-Object ` 
      | Out-String ` 
      | Split-String -RemoveEmptyStrings ` 
      | Join-String -Separator ', '; }}; 

} 

$PeopleCondensed | Format-Table -AutoSize; 

這給了我這樣的:

PeopleName SiteLabel    
---------- ---------    
Bill Jones SL1, SL2, SL3   
John Smith SL1, SL2, SL3, SL4, SL5 
Claire Harris SL1, SL2, SL3   
Fran Goddard SL1, SL3, SL4   

它不匹配您的預期輸出,但那是因爲數據不代表您的預期輸出。

您會注意到,我沒有使用任何for循環來支持foreach循環。這是PowerShell的最佳實踐。用迭代器變量嘲弄是浪費時間。我也會自由使用管道。這也是PowerShell的最佳實踐。

+0

'Join-String'和'Split-String'從哪裏來? – Matt

+0

@Matt啊,這些來自[PowerShell社區擴展](https://pscx.codeplex.com/)。完全忘記那些不是核心。 –

+0

我曾經假設過。可能值得在那裏編輯。 – Matt

0

我對你的數據做了與培根位相同的假設。你的數據和問題不應該得到預期的輸出。我使用Group-Objectcalculated properties獲得與培根位相同的結果。我也在假設你的數據是一個csv,其中Sitelabel是一個以逗號分隔的字符串。 $data是那個導入的csv對象。

$data | Select PeopleName,@{Name="Sitelabel";Expression={$_.Sitelabel.trim() -split "\s?,\s?"}} | 
    Group-Object Peoplename | 
    Select @{Name="Peoplename";Expression={$_.Name}}, @{Name='Sitelabel';Expression={($_.Group.Sitelabel | Sort-Object -Unique) -join ", "} 
} 

我們採取每個用戶的Sitelabel-split成一個數組。然後Group-Object羣人,然後撥打那個人Sitelabel s。我們按字母順序排列所有這些內容,並刪除所有重複項。您可以立即將其導出回原始文件。