“按值合并2个CSV”;名称“;和合并计数(Powershell)

“按值合并2个CSV”;名称“;和合并计数(Powershell),powershell,csv,merge,count,Powershell,Csv,Merge,Count,所以此刻我正在寻找一种合并2个CSV文件的方法 下面是一个例子来说明我的意思: CSV1 CSV2 现在,如果将两者合并,则输出/结果应为: "Name","Count" "Klaus","5" "Hans","3" "Gerhard","2" "Nina","7" "Julia","10" "Caro","19" 我尝试了很多,但从未成功过;我总是有错误的结果。有人知道怎么做吗?导入CSV文件并将每个文件转换为哈希表,然后查找常用名称: $csv1 = Import-Csv -Path cs

所以此刻我正在寻找一种合并2个CSV文件的方法

下面是一个例子来说明我的意思:

CSV1

CSV2

现在,如果将两者合并,则输出/结果应为:

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

我尝试了很多,但从未成功过;我总是有错误的结果。有人知道怎么做吗?

导入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     

您可以使用
组对象
(别名
)按
名称
属性对所有内容进行分组。然后,您只需汇总组中每个人的
Count
属性<代码>度量对象(别名
度量
)将为您计算总和

$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

这将丢弃CSV2中不在CSV1@CoralDoe:这就是我今天尝试的$neu=import csv.csv$full=import csv complete.csv$names=$full | Select-ExpandProperty Name$row=0 foreach($neu中的名称){if($names-包含$neu[$row].Name){[int]$full[($names |选择字符串($neu[$row].Name)).linenumber-1].count[int]$full[($names | Select String($neu[$row].name)).linenumber-1].count+[int]@($neu[$row]).count}$row++}[/meta meta]这是我的一次尝试。我知道它会以某种方式失败(它不适用于其他csv中没有的名称,但它甚至根本不起作用).Edit:我对这里的编辑器有点问题,建议使用
导出Csv-notype
以避免在输出文件中获取类型信息。@latkin:谢谢你的回答!效果很好。我没想到这会这么容易。我现在完全是哑巴!假设我有一个类似Csv的CSV1(但要大得多)如果我现在这样做:导入csv csv1 |排序计数-降序;排序不正确。它似乎忽略了计数…你有什么想法吗?我现在觉得很愚蠢…我不知道为什么它不起作用。请将我的回答标记为答案如果它解决了你的问题,那么其他人将知道你的问题已经得到回答。关于排序问题-没有答案任何其他信息,
Import Csv
必须假设所有字段都是字符串。因此,您正在根据Count的字符串进行排序。您希望根据Count的int值进行排序。执行以下操作:
Import Csv。\Csv1.Csv | sort{[int]$\uuCount}-降序
您可以向我们展示PowerShell中的代码,以了解您的错误吗?
$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     
$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