PowerShell实现CSV对象分组输出指定格式列表的最简方法
PowerShell按字段分组CSV的极简实现
问题
现有如下格式的CSV文件:
Name,group_name,group_id foo,Best,1 bar,Worst,2 baz,Best,1 bob,Worst,2
需要用最简洁的PowerShell写法,实现按组聚合,输出如下结果:
Count group_id group_name Names ----- -------- ---------- ----- 2 1 Best ["foo", "baz"] 2 2 Worst ["bar", "bob"]
最简实现
直接用PowerShell内置的CSV导入、分组、自定义对象输出三个步骤即可完成,完全匹配输出格式的单行命令如下:
Import-Csv .\data.csv | Group-Object group_id, group_name | ForEach-Object { [PSCustomObject]@{ Count = $_.Count; group_id = $_.Group[0].group_id; group_name = $_.Group[0].group_name; Names = '["{0}"]' -f ($_.Group.Name -join '", "') } }
如果需要更好的可读性,可以拆成多行格式:
Import-Csv .\data.csv | Group-Object group_id, group_name | ForEach-Object { [PSCustomObject]@{ Count = $_.Count group_id = $_.Group[0].group_id group_name = $_.Group[0].group_name Names = '["{0}"]' -f ($_.Group.Name -join '", "') } }
实现逻辑:
Import-Csv会自动把CSV内容解析为按列名存属性的结构化对象,不需要手动处理文本分割Group-Object同时按group_id、group_name两个字段分组,避免字段值不匹配导致的分组错误- 遍历每个分组时,直接用分组对象自带的
Count属性得到组内成员数,从分组的第一条记录提取组ID、组名即可 - 提取组内所有
Name字段后,用字符串拼接直接生成和示例完全一致的["foo", "baz"]格式数组字符串;如果不需要严格匹配逗号后的空格,也可以把Names部分替换为$_.Group.Name | ConvertTo-Json -Compress,写法更短。
内容的提问来源于stack exchange,提问作者moutonjr
相关产品推荐
相关产品推荐

