我正在尝试使用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
非常感谢任何建议/指导
答案 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-Object
和calculated 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
。我们按字母顺序对所有这些进行排序并删除任何重复项。您现在可以轻松将其导出回原始文件。