【问题标题】:Merge 2 CSV by Value "Name" and merge Count (Powershell)按值“名称”合并 2 个 CSV 并合并计数(Powershell)
【发布时间】:2012-09-13 03:30:44
【问题描述】:

所以现在我正在寻找一种方法来合并 2 个 CSV 文件。

这是我的意思的一个例子:

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"

现在如果我合并两者,输出/结果应该是:

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

我尝试了很多,但我从来没有成功过;我总是得到错误的结果。有谁知道如何做到这一点?

【问题讨论】:

  • 您能否向我们展示您使用 PowerShell 中的代码来查看您做错了什么?

标签: powershell csv merge count


【解决方案1】:

您可以使用Group-Object(别名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

【讨论】:

  • 建议使用Export-Csv -notype 避免在输出文件中获取类型信息。
  • @latkin:谢谢你的回答!工作完美。没想到这么简单
  • 好吧,我现在完全傻了!假设我有一个类似 CSV1 的 CSV(但要大得多)如果我现在这样做:import-csv csv1 |排序计数-降序;它没有正确排序。似乎它忽略了 Count.... 你有什么想法吗?我现在觉得很愚蠢......我不知道为什么它不起作用
  • 如果我的回答解决了您的问题,请标记为答案,然后其他人就会知道您的问题已得到回答。
  • 关于排序问题 - 没有任何其他信息,Import-Csv 必须假设所有字段都是字符串。因此,您正在根据 Count 的 string 进行排序。您想根据 Count 的 int 值进行排序。这样做:Import-Csv .\Csv1.csv | sort {[int] $_.Count} -Descending
【解决方案2】:

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

【讨论】:

  • 这将丢弃 CSV2 中所有不在 CSV1 中的名称
  • @Coral Doe:这就是我尝试过的Meta Stack Overflow $neu = import-csv today.csv $full = import-csv complete.csv $names= $full | Select -ExpandProperty Name $row = 0 foreach ($name in $neu) { if ($names -contains $neu[$row].name) { [int]$full[($names | Select-String ($neu[ $row].name)).linenumber-1].count = [int]$full[($names | Select-String ($neu[$row].name)).linenumber-1].count + [int] @($neu[$row]).count } $row++ } [/meta] 这是我的尝试之一。我知道它会以某种方式失败(它不适用于不在其他 csv 中的名称,但它甚至根本不起作用)。编辑:我这里的编辑器有点问题
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多