1

So at the momemt I'm searching for a way to merge 2 CSV files.

Here is an example for what I mean:

CSV1

"Name","Count"
"Klaus","3"
"Hans","2"
"Gerhard","1"
"Nina","6"
"Julia","10"
"Caro","19"

CSV2

"Name","Count"
"Klaus","2"
"Hans","1"
"Gerhard","1"
"Nina","1"

Now if I merge both, the output/result should be:

"Name","Count"
"Klaus","5"
"Hans","3"
"Gerhard","2"
"Nina","7"
"Julia","10"
"Caro","19"

I tried a lot, but I´ve never had suscess; I always had wrong results. Does anyone have an idea how to do this?

4

2 回答 2

2

您可以使用Group-Object(alias group) 按Name属性对所有内容进行分组。然后你只需要总结Count小组中每个人的财产。 Measure-Object(别名measure)将为您计算总和。

$grouped = Import-Csv .\csv1.csv, .\csv2.csv | group Name
$combined = $grouped |%{ 
   New-Object PsObject -Prop @{ Name = $_.Name; Count = ($_.Group | measure -sum -prop Count).Sum }
}
$combined | Export-Csv .\combined.csv -NoType
于 2012-09-20T19:12:12.433 回答
0

导入 CSV 文件并将每个文件转换为哈希表,然后找到常用名称:

$csv1 = Import-Csv -Path csv1.csv
$csv2 = Import-Csv -Path csv2.csv

$HashCSV1 = @{}
$HashCSV2 = @{}
$HashMerge = @{}

foreach($r in $csv1)
{
    $HashCSV1[$r.Name] = $r.Count
}

foreach($r in $csv2)
{
    $HashCSV2[$r.Name] = $r.Count
}

foreach ($key in $HashCSV1.Keys) { 
    if ($HashCSV2.ContainsKey($key)) {
        $HashMerge[$key] = [int]$HashCSV1[$key] + [int]$HashCSV2[$key]
    } else {
        $HashMerge[$key] = $HashCSV1[$key]
    }
}

foreach ($key in $HashCSV2.Keys) { 
    if (-not $HashCSV1.ContainsKey($key)) {
        $HashMerge[$key] = $HashCSV2[$key]
    }
}

&{$HashMerge.getenumerator() |
  foreach {new-object psobject -Property @{Name = $_.name;Count=$_.value}}
  } | export-csv merge.csv -notype     
于 2012-09-20T18:59:55.630 回答