如何从csv文件循环遍历层次结构?

时间:2020-07-06 17:52:14

标签: powershell

给出以下csv文件,如何正确遍历它?我需要某种哈希表吗?

csv文件:

AD/Profile Name,Org Level,Org Member
AD_Group1,Region,"China
USA"
AD_Group2,Sub Region,"China
Corp"
AD_Group3,Sub Region,USA

代码:

$clmns = Import-Csv .\File1.csv

foreach ($ADGroup in $clmns.'AD/Profile Name') {
    $ADGroup
    foreach ($orglvl in $ADGroup.'Org Level') {
    $orglvl
    
        foreach ($orgmember in $orglvl.'Org Member') {
            $orgmember
            
        }
    }
}

$orglvl$orgmember不在运行此程序时打印出任何内容

预期结果:

AD_Group1
Region
China
USA
AD_Group2
Sub Region
China
Corp
AD_Group3
Sub Region
USA

3 个答案:

答案 0 :(得分:2)

怎么样?

$clmns = Import-Csv "G:\BEKDocs\Scripts\Test\File1.csv"

$clmns | 
  ForEach-Object {
    $orglvl = $_.'Org Level'
    $Members =  ($_.'Org Member').split("`r`n")
    "$($_.'AD/Profile Name')"
    For ($Cntr=0; $cntr -lt $Members.count; $Cntr+=2) { 
      "Member: $($Members[$($Cntr)]) `tLevel: $orglvl"
    }
  }

输出:

AD_Group1
Member: China   Level: Region
Member: USA     Level: Region
AD_Group2
Member: China   Level: Sub Region
Member: Corp    Level: Sub Region
AD_Group3
Member: USA     Level: Sub Region

HTH

答案 1 :(得分:1)

那呢?

foreach ($ADGroup in $clmns.'AD/Profile Name') {
    $tmp = $clmns | Where-Object {$_.'AD/Profile Name' -eq $ADGroup}

    foreach ($orglvl in $tmp.'Org Level') {
        $orglvl
        $tmp2 = $tmp  | Where-Object {$_.'Org Level' -eq $orglvl}
            foreach ($orgmember in $tmp2.'Org Member') {
                $orgmember

            }
            

    }
}

可能还有一些问题,但是我想你明白了

答案 2 :(得分:1)

Group-Object应该能够处理此任务:

$clmns = Import-Csv .\File1.csv
$clmns | Group-Object -Property 'Org Level' | Foreach-Object {
    $_.Name
    $_.Group.'Org Member'
}

Name属性将是经过迭代的Org Level值。通过Group属性可以访问已分组的对象。

编辑1:

根据更新后的帖子,您只需要一个循环即可列出所有值:

$clmns = Import-Csv .\File1.csv
foreach ($row in $clmns) {
    $row.'ad/profile name'
    $row.'org level'
    $row.'org member'
}

编辑2:

我从powershell.org网站阅读了您的帖子。您可以执行以下操作来完成任务。我假设$table已经包含自定义对象的数组。

$clmns = Import-Csv .\File1.csv
foreach ($row in $clmns) {
    $ADGroup = $row.'AD/Profile Name'
    $OrgLevel = $row.'Org Level'
    $data = $table | Where {$_.$OrgLevel -in ($row.'Org Member' -split '\r?\n') }
    [pscustomobject]@{'AD Group' = $ADGroup; 'Org Codes' = "{0}|" -f ($data.'Org Code' -join '|')}
}
相关问题