首页 > 解决方案 > 如果来自另一个文件的引用正确,则将数据相加

问题描述

我有两个 CSV 文件,如下所示:

test.csv

"Col1","Col2"
"1111","1"
"1122","2"
"1111","3"
"1121","2"
"1121","2"
"1133","2"
"1133","2"

第二个看起来像这样:

test2.csv

“数字”、“标志”
"1111","ABC"
"1122","DEF"
"1111","ABC"
“1121”,“ABC”
"1133","GHI"

现在的目标是获得从test.csv分配到“标志”的所有点的摘要test2.csv。如您所见,参考是数字。

应该是这样的:

ABC = 8
防御 = 2
GHI = 4

我试图对此进行测试,但无法达到目标。到目前为止,我所拥有的是:

$var = "C:\PathToCSV"
$csv1 = Import-Csv "$var\test.csv"
$csv2 = Import-Csv "$var\test2.csv"

# Process: group by 'Item' then sum 'Average' for each group
# and create output objects on the fly
$test1 = $csv1 | Group-Object Col1 | ForEach-Object {
    New-Object psobject -Property @{
        Col1 = $_.Name
        Sum = ($_.Group | Measure-Object Col2 -Sum).Sum
    }
}

但这给了我以下输出:

ps> $test1

总和 Col1
--- ----
  4 1111
  2 1122
  4 1121
  4 1133

我无法获得标志的摘要和映射。

标签: powershell

解决方案


不确定我是否正确理解了您的问题,但我将假设对于“符号”列中的每个值,您要查找第二个 CSV 中“数字”列中的值,然后计算列的总和所有匹配的“Col2”。

为此,我将使用“Col1”中唯一值的预先计算的总和构建一个哈希表:

$h1 = @{}
$csv1 | ForEach-Object {
    $h1[$_.Col1] += [int]$_.Col2
}

然后构建第二个哈希表来总结第二个 CSV 值的查找结果:

$h2 = @{}
$csv2 | ForEach-Object {
    $h2[$_.signs] += $h1[$_.Number]
}

但是,当我处理您的示例数据时,“ABC”的值与您在问题中所说的期望结果不同:

名称 值
---- -----
ABC    12
GHI 4
防御2

或者你的意思是你想总结每个标志的唯一数字的相应值?为此,您可以将第二个代码段更改为以下内容:

$h2 = @{}
$csv2 | Group-Object signs | ForEach-Object {
    $name = $_.Name
    $_.Group | Select-Object -Unique -Expand Number | ForEach-Object {
        $h2[$name] += $h1[$_]
    }
}

这将从您的问题中产生预期的结果:

名称 值
---- -----
ABC    8
GHI 4
防御2

推荐阅读