说我有一个简单的csv文件。该模型包含4个字段id
,name
,group
和sub
。 group字段的整数值介于1和15之间,可以重复。
所以我要做的是选择不在第7组和第9组中的所有记录......我已经写了以下代码:
$csv = Import-Csv -Path names.csv -Header @('id', 'name', 'group', 'sub')
$total = $csv | select group -unique
write-host "total:", $total.length
$ignore = $csv | where { $_.sub -eq 'a'}
write-host "total to ignore:", $ignore.length
$ignoreGroups = $ignore | select group -unique
write-host "Groups to ignore:", $ignoreGroups.length
$workingGroups = $csv | where {$ignore -notcontains $_ } | select group -unique
write-host "Working groups count:", $workingGroups.Length
上一行报告错误结果。
我的目标是一次处理属于$csv
一组的记录(即$workingGroups
中的组)。
Ps:这只是一个模型,而不是真实的数据。真实数据是我必须处理的巨大日志文件。
示例数据:https://gist.github.com/deostroll/4ced74eef461de61f477
编辑:
我试图使用group
选择dist select-object
值,但我得到的是一个对象数组(每个对象都有group
属性)。我该怎么做才能将不同的group
值单独作为整数数组...?
答案 0 :(得分:1)
"所以我要做的就是选择不在第7组和第7组中的所有记录 9"
$csv | ?{ $_.group -ne 7 -and $_.group -ne 9 }
我真的不知道你的代码会尝试做什么。
发表评论后:
$groups = $csv | ?{ $_.sub -ne "a" } | group-object group
然后,您可以通过以下方式访问群组:
$groups | %{ $_.Name; $_.Group | %{ $_ /*Do whatever you want with each group member here */} }
答案 1 :(得分:1)
这是我的理解......
<强>要求强>
<强>代码强>
$WorkingList = $csv | where { ($_.sub -ne "a") -and (@(9,7) -notcontains $_.group)}
$WorkingGroups = $WorkingList | group-object group
这就是您采样的数据最终看起来像
PS > $WorkingGroups
Count Name Group
----- ---- -----
2 2 {@{id=5; name=Carlene Preston; group=2; sub=b}, @{id=9; name=Mccullough Fisher; group=2; sub=b}}
2 3 {@{id=10; name=Tara Gallagher; group=3; sub=b}, @{id=12; name=Morton Whitley; group=3; sub=b}}
1 4 {@{id=4; name=Shannon Donovan; group=4; sub=b}}
1 5 {@{id=1; name=Chandler Cox; group=5; sub=b}}
1 8 {@{id=3; name=Brown Gardner; group=8; sub=b}}
3 11 {@{id=0; name=Eleanor Whitney; group=11; sub=b}, @{id=2; name=Georgette Simpson; group=11; sub=b}, @{id=7; name=Holland Mccarty; group=11; sub=b}}
1 12 {@{id=14; name=Butler Hale; group=12; sub=b}}
1 14 {@{id=8; name=Larson Larson; group=14; sub=b}}
这接近你所追求的吗?
修改强>
简单地处理数据,遍历组和项目。
foreach ($group in $WorkingGroups){
write-host "Processing Group: $($group.Name)"
foreach ($item in $group.Group){
write-host "`tProcessing Item: $($item.Name)"
}
}
结果
Processing Group: 2
Processing Item: Carlene Preston
Processing Item: Mccullough Fisher
Processing Group: 3
Processing Item: Tara Gallagher
Processing Item: Morton Whitley
Processing Group: 4
Processing Item: Shannon Donovan
Processing Group: 5
Processing Item: Chandler Cox
Processing Group: 8
Processing Item: Brown Gardner
Processing Group: 11
Processing Item: Eleanor Whitney
Processing Item: Georgette Simpson
Processing Item: Holland Mccarty
Processing Group: 12
Processing Item: Butler Hale
Processing Group: 14
Processing Item: Larson Larson
<强> EDIT2 强>
数组内置了一组数组。要访问一组组:
$WorkingGroups.Name
答案 2 :(得分:0)
替代方式:使用-ExpandProperty
获取纯数组而不是Object[]
$workingGroups = $csv | where {$_.sub -ne 'a'} | select -ExpandProperty group -unique
foreach($group in $workingGroups) {
$recordset = $csv | where { $_.group -eq $group }
#do something with $recordset
}