合并多个CSV文件遇空值及分号CSV兼容问题求助
解决CSV合并的空值问题与分号CSV兼容方案
这里是修正后的PowerShell脚本,解决了空值问题并兼容逗号/分号两种分隔符的CSV:
# 收集所有CSV文件到指定目录 function Get-CsvFiles { $targetDir = Join-Path $PSScriptRoot "cvsData" # 确保目标目录存在 if (-not (Test-Path $targetDir)) { New-Item -ItemType Directory -Path $targetDir | Out-Null } # 递归查找当前目录下的CSV并移动 Get-ChildItem -Recurse -Path "$PWD\*.csv" | Move-Item -Destination $targetDir -Force } # 自动检测CSV文件的分隔符(逗号或分号) function Get-CsvDelimiter { param([string]$FilePath) $sample = Get-Content $FilePath -Head 5 $commaCount = ($sample | ForEach-Object { ($_ -split ',', [StringSplitOptions]::RemoveEmptyEntries).Count }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum $semicolonCount = ($sample | ForEach-Object { ($_ -split ';', [StringSplitOptions]::RemoveEmptyEntries).Count }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum return if ($semicolonCount -gt $commaCount) { ';' } else { ',' } } # 合并CSV文件 function Merge-CsvFiles { $sourceDir = Join-Path $PSScriptRoot "cvsData" $outputPath = Join-Path $sourceDir "merged.csv" $sourceFiles = Get-ChildItem -Path $sourceDir -Filter "*.csv" | Where-Object { $_.Name -ne "merged.csv" } # 使用ArrayList提升合并效率 $mergedData = New-Object System.Collections.ArrayList $allColumns = @() foreach ($file in $sourceFiles) { $delimiter = Get-CsvDelimiter -FilePath $file.FullName $csvData = Import-Csv -Path $file.FullName -Delimiter $delimiter # 收集所有出现过的列 $allColumns = $allColumns + $csvData[0].PSObject.Properties.Name | Select-Object -Unique # 将当前文件的数据添加到合并集合 foreach ($row in $csvData) { $mergedRow = [PSCustomObject]@{} foreach ($col in $allColumns) { $mergedRow | Add-Member -MemberType NoteProperty -Name $col -Value $row.$col } [void]$mergedData.Add($mergedRow) } } # 导出合并后的CSV,统一用逗号分隔 $mergedData | Export-Csv -Path $outputPath -Delimiter "," -NoTypeInformation -Force } # 执行收集与合并 Get-CsvFiles Merge-CsvFiles
关键改进说明
- 自动检测分隔符:通过读取每个CSV的前5行,统计逗号和分号的数量,自动选择正确的分隔符导入,彻底解决分号CSV导入错误导致的空值问题。
- 统一列结构:收集所有CSV的列名,合并时确保每一行都包含所有列,避免因列不一致产生的空值,同时保证数据结构完整。
- 优化性能:用
ArrayList代替数组拼接(+=),避免频繁数组扩容带来的性能损耗,尤其是处理大量CSV文件时更明显。 - 目录安全处理:提前检查目标目录是否存在,不存在则自动创建,避免移动文件失败。
- 排除已合并文件:合并时跳过已生成的
merged.csv,防止重复合并。
内容的提问来源于stack exchange,提问作者edi Anderegg
相关产品推荐
相关产品推荐

