【问题标题】:How to loop through hierarchy from csv file?如何从csv文件循环遍历层次结构?
【发布时间】:2020-07-06 17:52:14
【问题描述】:

鉴于以下 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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这个怎么样?

    $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

    【讨论】:

      【解决方案2】:

      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 '|')}
      }
      

      【讨论】:

      • 哦,哇,这太简单了,太棒了:D 然而,有一件事是它似乎结合了第三级和第二级。例如,我为子区域显示以下内容:中国公司美国,不应该是子区域:中国公司,然后是子区域:美国?
      • @Cataster,我没有看到这个问题。我分别看他们。但是,通过没有发布额外的换行符来修复您的文件。我认为这些是错误发布的。如果没有,我很抱歉,但如果有必要,我不明白。
      • 我认为换行符是故意的。至少我在记事本++中是如何看待它的。例如,如果我使用我发布的 csv 信息运行下面的 user3898488 代码,我会得到正确的输出
      • 基本上,我还希望在输出中也能识别 AD 配置文件。也许这会用这种方法修复输出?
      • @Cataster 你能在你的帖子中发布一个理想输出的例子吗?
      【解决方案3】:

      这个怎么样?

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

      这可能还是有点问题,但我想你明白了

      【讨论】:

      • 是的,这个绝对可以按预期工作 :) 它只是缺少外循环的右括号
      • Wouls,是的,你说得对。我已经在我的答案中修复了它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多