来自csv文件的powershell过滤记录集

时间:2015-05-27 18:05:54

标签: powershell csv

说我有一个简单的csv文件。该模型包含4个字段idnamegroupsub。 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值单独作为整数数组...?

3 个答案:

答案 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)

这是我的理解......

<强>要求

  • 处理CSV数据
  • 排除sub =“a”
  • 的所有记录
  • 排除第7组和第7组9
  • 按组分组剩余数据以进行处理

<强>代码

$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
}