You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:52:55