PowerShell如何遍历CSV文件并按名称生成汇总哈希表
PowerShell按Name分组求和解决方案
假设你已经通过Import-Csv读取了CSV文件(如果还没执行,用$csvData = Import-Csv -Path "你的文件路径.csv"完成),下面提供两种可行的实现方式:
方法一:用Group-Object快速分组求和(推荐)
这是最简洁的方式,利用PowerShell内置的分组和度量命令直接完成计算:
$summary = $csvData | Group-Object -Property Name | ForEach-Object { [PSCustomObject]@{ Name = $_.Name TotalValue1 = ($_.Group | Measure-Object -Property Value1 -Sum).Sum TotalValue2 = ($_.Group | Measure-Object -Property Value2 -Sum).Sum } } # 输出你需要的格式 $summary | ForEach-Object { "$($_.Name):$($_.TotalValue1),$($_.TotalValue2)" }
关键步骤解释
Group-Object -Property Name:将原始数据按Name字段分组,每个分组对象包含Name(分组名称)和Group(该组的所有原始条目)。Measure-Object -Property Value1 -Sum:对当前分组的Value1列求和,通过.Sum提取最终的求和结果。[PSCustomObject]:创建自定义对象存储汇总结果,方便后续的格式输出或进一步处理。
方法二:用Hashtable手动累加(适合理解底层逻辑)
如果你想手动实现累加逻辑,用Hashtable可以这样写:
$sumHashtable = @{} $csvData | ForEach-Object { # 确保数值类型,避免字符串拼接错误 $name = $_.Name $value1 = [int]$_.Value1 $value2 = [int]$_.Value2 if ($sumHashtable.ContainsKey($name)) { # 已存在该分组,累加数值 $sumHashtable[$name].Value1 += $value1 $sumHashtable[$name].Value2 += $value2 } else { # 首次遇到该分组,初始化数值 $sumHashtable[$name] = [PSCustomObject]@{ Value1 = $value1 Value2 = $value2 } } } # 输出结果 $sumHashtable.GetEnumerator() | ForEach-Object { "$($_.Key):$($_.Value.Value1),$($_.Value.Value2)" }
注意事项
- 务必将
Value1和Value2转换为数值类型(比如[int]),因为Import-Csv读取的CSV列默认是字符串类型,直接相加会变成字符串拼接而不是数值求和。 - 两种方法最终都会输出你需要的格式:
IT:550,40、HR:98,23。
内容的提问来源于stack exchange,提问作者user1176737
相关产品推荐
相关产品推荐

