【问题标题】:How do I group and sum CSV rows by shared column value?如何按共享列值对 CSV 行进行分组和求和?
【发布时间】:2018-10-17 06:45:25
【问题描述】:

我是 powershell 新手,目前遇到一个问题。

我导入一个包含 2 列(服务器名称和大小)的 CSV 文件 像这样:

Server | Size
-------------
SRV1   | 140

SRV2   | 120

SRV1   | 100

SRV1   | 140

SRV2   | 200

我想为每个服务器添加所有 Size 值,例如:

SRV2 = 120+200
SRV1 = 140+100+140

我不知道该怎么做。 我尝试使用 for 循环,但操作是针对每一行完成的,所以我的结果是错误的。 谁能帮帮我?

【问题讨论】:

    标签: windows powershell csv grouping


    【解决方案1】:

    用途:

    Import-Csv file.csv | Group-Object Server | 
      Select-Object Name, @{ n='Size'; e={ ($_.Group | Measure-Object Size -Sum).Sum } }
    

    如果要将第一个输出列命名为Server,请将Name 替换为@{ n='Server'; e='Name' }

    使用您的示例数据,上述结果:

    Name Size
    ---- ----
    SRV1  380
    SRV2  320
    

    【讨论】:

      【解决方案2】:

      这是一个示例:

      $Data = Import-Csv -Path "yourfilepath" -Delimiter ";"
      
      $SortedData = $Data | Group {$_.server}
      $Hashtable = @{}
      $SortedData.group | ForEach-Object {
          if ($Hashtable.Contains($_.server)) {
              $Hashtable[$_.server] += ",$($_.size)"
          } else {
              $Hashtable.Add($_.server,$_.size)
          }
      }
      

      您需要根据自己的情况更改分隔符

      【讨论】:

      • 感谢您的回答。如果我的 CSV 包含超过 2 个不同的服务器,它还能工作吗?因为在我的示例中,我有 2 台服务器,但实际上,它可以是 3 台或 4 台。
      • 它应该适用于任何数量的服务器,请在解决您的问题时将答案标记为解决方案。
      • 我认为其目的实际上是对这些值进行 sum(将它们相加并报告总和),而不是生成加法运算的字符串表示形式。另请注意,使用哈希表无法保证条目的顺序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2015-05-17
      • 2011-02-15
      • 2012-03-29
      相关资源
      最近更新 更多