如何用Powershell按MPN分组累加筛选符合阈值的CSV行
PowerShell CSV订单库存分配筛选实现方案
核心实现逻辑
- 读取CSV时完成字段类型预处理,避免字符串排序、数值运算错误
- 用
Group-Object按MPN字段分组,直接取组内第一条的Reserved_Sum作为当前组的累加阈值 - 每组内先将订单按Customer_Order_Date升序排序,保证从最早订单开始计算
- 逐行累加Backordered_by_Pallet值,每累加一行就将该行加入结果集,直到累加总和大于等于阈值后停止当前组遍历;如果整组累加完仍未达到阈值,自动输出整组所有行
- 最终结果可直接导出为新CSV文件
完整可运行代码
# 配置输入输出路径,替换为你自己的实际路径 $sourceCsvPath = "D:\your_order_data.csv" $outputCsvPath = "D:\filtered_order_result.csv" # 读取源CSV数据 $rawData = Import-Csv -Path $sourceCsvPath -Encoding UTF8 $filteredResult = foreach ($mpnGroup in $rawData | Group-Object -Property MPN) { # 取当前MPN的预留总 pallet 阈值 $reservedTotal = [decimal]$mpnGroup.Group[0].Reserved_Sum $currentCumulative = 0 # 组内按订单日期升序排序,特殊日期格式可替换为ParseExact指定格式,例如: # Sort-Object { [DateTime]::ParseExact($_.Customer_Order_Date, "yyyy-MM-dd", $null) } $sortedOrderList = $mpnGroup.Group | Sort-Object { [DateTime]$_.Customer_Order_Date } # 逐行累加筛选 foreach ($order in $sortedOrderList) { $currentCumulative += [decimal]$order.Backordered_by_Pallet # 输出当前行到结果集 $order # 累加值达到阈值后终止当前组遍历 if ($currentCumulative -ge $reservedTotal) { break } } } # 导出结果到CSV $filteredResult | Export-Csv -Path $outputCsvPath -Encoding UTF8 -NoTypeInformation
注意事项
- 如果你的CSV中日期格式不是系统默认格式,需要修改排序部分的日期解析逻辑,用
ParseExact指定你实际使用的日期格式字符串即可 - 代码中所有数值字段默认转decimal类型处理,避免整数、浮点数运算精度问题,可根据你的实际数据格式调整
- 单文件十万行量级以内处理无性能压力,超大文件可调整为流式逐行读取逻辑降低内存占用
内容的提问来源于stack exchange,提问作者moore1emu
相关产品推荐
相关产品推荐

