2016-03-07 124 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。我们按字母顺序排列所有这些内容,并删除所有重复项。您可以立即将其导出回原始文件。