如何合并CSV中部门编号以‘8’开头的行并统一OwnerEmail?
解决方案
PowerShell 实现步骤
方法一:分组处理
- 导入并预处理CSV数据:将Costs字段转换为数值类型,确保求和计算准确。
- 拆分数据组:分离出DepartmentNumber以'8'开头的行和其余行。
- 合并目标组:汇总Costs总和,统一设置OwnerEmail为
test@mail.com,保留目标组中任意一行的Employee ID和DepartmentNumber。 - 合并结果并输出:将合并后的行与其余行组合,输出或保存为新CSV文件。
完整代码:
# 导入CSV并转换Costs为数值类型 $csvData = Import-Csv -Path "input.csv" | ForEach-Object { $_.Costs = [decimal]$_.Costs $_ } # 分离DepartmentNumber以'8'开头的行和其他行 $targetGroup = $csvData | Where-Object { $_.DepartmentNumber -like '8*' } $remainingRows = $csvData | Where-Object { $_.DepartmentNumber -notlike '8*' } # 计算目标组的总成本 $totalCost = ($targetGroup | Measure-Object -Property Costs -Sum).Sum # 创建合并后的行 $mergedRow = [PSCustomObject]@{ 'Employee ID' = $targetGroup[0].'Employee ID' OwnerEmail = 'test@mail.com' DepartmentNumber = $targetGroup[0].DepartmentNumber Costs = $totalCost.ToString("N2") # 格式化为带千分位的两位小数 } # 合并所有行并输出 $finalResult = $remainingRows + $mergedRow $finalResult | Format-Table -AutoSize # 可选:导出到新CSV文件 # $finalResult | Export-Csv -Path "output.csv" -NoTypeInformation
方法二:使用Group-Object简化分组
通过自定义分组键,将所有以'8'开头的行归为同一组,其余行各自为独立组,再分别处理:
$csvData = Import-Csv -Path "input.csv" | ForEach-Object { $_.Costs = [decimal]$_.Costs $_ } $finalResult = $csvData | Group-Object -Property { # 自定义分组键:以'8'开头的行归为"Group8",其他行用Employee ID作为唯一标识 if ($_.DepartmentNumber -like '8*') { "Group8" } else { $_.EmployeeID } } | ForEach-Object { if ($_.Name -eq "Group8") { # 处理合并组 [PSCustomObject]@{ 'Employee ID' = $_.Group[0].'Employee ID' OwnerEmail = 'test@mail.com' DepartmentNumber = $_.Group[0].DepartmentNumber Costs = ($_.Group | Measure-Object -Property Costs -Sum).Sum.ToString("N2") } } else { # 保留原始行并格式化Costs $row = $_.Group[0] $row.Costs = $row.Costs.ToString("N2") $row } } $finalResult | Format-Table -AutoSize
说明
- 代码中
input.csv和output.csv需替换为实际文件路径。 - 格式化
Costs为N2会自动添加千分位分隔符,匹配期望结果的格式。 - 若需保留所有目标组的DepartmentNumber信息,可将
DepartmentNumber字段修改为$_.Group.DepartmentNumber -join ', '。
内容的提问来源于stack exchange,提问作者CoCoBl
相关产品推荐
相关产品推荐

