【问题标题】:Add multiple columns based on unique entries in other column in csv with powershell使用powershell根据csv中其他列中的唯一条目添加多列
【发布时间】:2014-08-21 21:51:45
【问题描述】:

去年我用 powershell 做了一些基本的工作,但出于某种原因,这让我回避了。任何帮助将不胜感激。

我有一个包含数百个条目的 csv 文件:

Path,Data,Files
\\someserver\somepath1,100,1
\\someserver\somepath2,150,4
\\someserver\somepath1,200,5
\\someserver\somepath3,450,8
\\someserver\somepath4,200,23
\\someserver\somepath1,350,2
\\someserver\somepath2,800,9

我想让 powershell 脚本解析文件并生成一个新的 csv,其结果显示唯一路径以及汇总的数据和文件值。所以从上面我的预期结果将是(最好按最大数据值排序):

Path,Data,Files
\\someserver\somepath2,950,9
\\someserver\somepath1,650,8
\\someserver\somepath3,450,8
\\someserver\somepath4,200,23

我找到了几个关于对单列求和的答案,但我还没有弄清楚两列。任何关于代码和/或技术的建议将不胜感激。谢谢!

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    丑陋的代码...

    $csv=Import-Csv c:\temp\test.csv 
    $csv | select -Unique -expand path|%{
        $path=$_
        $sdata=($csv | ?{$_.path -eq $path} | measure-object data -sum).sum
        $files=($csv | ?{$_.path -eq $path} |  Measure-Object files -sum).sum   
        "$path,$sdata,$files" |out-file c:\temp\new.csv -append
    }   
    

    【讨论】:

      【解决方案2】:

      远不如 Kayasax 优雅的解决方案,但仍然有效。这将在每个条目构建和数组中循环。当它找到数组中已经存在的路径时,它会添加数据和文件的值。这也会输出一个您可以使用 powershell 命令的对象!

      $collection = @()
      Import-Csv E:\temp\stack.csv | ForEach-Object{
          If ($collection.Count -gt 0) {
              If ($collection.path.IndexOf($_.Path) -ne -1){
                  # We already know about this path. Add Values
                  $index = $collection.path.IndexOf($_.Path)
                  $collection[$index].Data = [int]$collection[$index].Data + [int]$_.Data
                  $collection[$index].Files = [int]$collection[$index].Files + [int]$_.Files
              } Else {
                  # Add this objec to the collection
                  $properties = @{'Path'=$_.Path;
                              'Data'=$_.Data;
                              'Files'=$_.Files}
                  $object = New-Object –TypeName PSObject –Prop $properties
                  $collection += $object
              }
          } Else {
              # Collection is empty. Add the first one. 
              $properties = @{'Path'=$_.Path;
                          'Data'=$_.Data;
                          'Files'=$_.Files}
              $object = New-Object –TypeName PSObject –Prop $properties
              $collection += $object
          }
      }
      
      $collection | Sort-Object data -Descending
      

      输出

      Path                                             Data                     Files
      ----                                             ----                     -----
      \\someserver\somepath2                            950                        13
      \\someserver\somepath1                            650                         8
      \\someserver\somepath3                            450                         8
      \\someserver\somepath4                            200                        23
      

      【讨论】:

      • 第二和第三条记录的标称文件值?
      • 如果您询问路径 1 和 3 的文件数是否正确? 1+5+2=8,另一个只有一个条目。我不明白这是什么问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2015-10-10
      • 2020-10-31
      • 2022-12-17
      相关资源
      最近更新 更多