使用powershell基于csv中其他列中的唯一条目添加多个列

时间:2014-08-21 12:12:11

标签: powershell csv

去年我和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

我已经找到了几个答案,指的是总结一个列,但我还没有弄清楚两列。对代码和/或技术的任何建议都将非常感激。谢谢!

2 个答案:

答案 0 :(得分:0)

丑陋的代码......

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

答案 1 :(得分:0)

然后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