使用PowerShell按列值拆分CSV为两个文件的技术问题
解决CSV按指定列拆分为两个文件的PowerShell方案
核心需求
将多个大型CSV文件按Grading Period Title列拆分:
- 列值为
*Overall*的行导出到overall.csv - 其余所有行导出到
term.csv,保留所有列数据
修正后的高效脚本(适合大型文件)
直接通过筛选而非分组实现,减少内存占用:
# 替换为你的CSV文件所在目录路径 $csvDirectory = "C:\Your\CSV\Folder" $csvFiles = Get-ChildItem -Path $csvDirectory -Filter "*.csv" # 遍历每个CSV文件,边处理边导出 foreach ($file in $csvFiles) { $csvData = Import-Csv -Path $file.FullName # 导出*Overall*行到overall.csv,-Append避免覆盖已有内容 $csvData | Where-Object { $_.'Grading Period Title' -eq '*Overall*' } | Export-Csv -Path "overall.csv" -NoTypeInformation -Append # 导出其余行到term.csv $csvData | Where-Object { $_.'Grading Period Title' -ne '*Overall*' } | Export-Csv -Path "term.csv" -NoTypeInformation -Append }
原代码问题说明
你之前的Group-Object用法有误:Group-Object没有-eq参数,它的作用是按指定列的所有唯一值分组,这会生成多个分组,不符合你只分两类的需求。直接用Where-Object筛选目标行,逻辑更简洁,处理大型文件时内存效率更高。
可选:用Group-Object实现的方案(不推荐用于超大型文件)
如果一定要基于分组逻辑调整,可参考以下代码,但会额外消耗分组的内存开销:
$csvDirectory = "C:\Your\CSV\Folder" $csvFiles = Get-ChildItem -Path $csvDirectory -Filter "*.csv" foreach ($file in $csvFiles) { $groups = Import-Csv -Path $file.FullName | Group-Object 'Grading Period Title' # 提取*Overall*分组并导出 $overallGroup = $groups | Where-Object { $_.Name -eq '*Overall*' } if ($overallGroup) { $overallGroup.Group | Export-Csv -Path "overall.csv" -NoTypeInformation -Append } # 合并其余所有分组并导出 $termGroups = $groups | Where-Object { $_.Name -ne '*Overall*' } if ($termGroups) { $termGroups | ForEach-Object { $_.Group } | Export-Csv -Path "term.csv" -NoTypeInformation -Append } }
内容的提问来源于stack exchange,提问作者MJB
相关产品推荐
相关产品推荐

