Powershell复制数据并结合使用

时间:2016-03-07 14:02:23

标签: powershell

我正在尝试使用Powershell中的一些重复数据并合并,我有一个包含两个字段的数组Peoplename和Sitelabel数据看起来像这样

import groovy.json.JsonBuilder
import groovy.json.JsonSlurper

def slurped = new JsonSlurper().parseText(SampleResult.getResponseDataAsString())
def builder = new JsonBuilder(slurped)
builder.content.configState = 'DELETED'
vars.put("json", builder.toPrettyString()) 

我想最终得到以下数据

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           

但我正在努力研究如何检查Sitelabel

非常感谢任何建议/指导

2 个答案:

答案 0 :(得分:1)

注意:此解决方案使用PowerShell Community Extensions模块中的Cmdlet。

您的数据与预期输出不符。例如,比尔琼斯没有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的最佳实践。

答案 1 :(得分:0)

我对您的数据做出与Bacon Bits相同的假设。您的数据和问题不应该得出预期的输出。我使用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。我们按字母顺序对所有这些进行排序并删除任何重复项。您现在可以轻松将其导出回原始文件。