如何用单个PowerShell脚本按序执行CSV列追加、合并与表头保留操作
没问题,我帮你搞定这两个PowerShell操作,尤其是那个包含三步的脚本需求,直接给你完整实现和详细说明:
完整PowerShell脚本(实现三步操作)
这个脚本会按顺序完成你要求的所有操作:给每个CSV加Filename列、合并所有CSV、仅保留第一个原文件的表头。
# 设置目标目录(可替换为你的实际路径,比如 "C:\Your\CSV\Folder") $targetDir = Get-Location # ① 为每个CSV文件添加Filename列 Get-ChildItem -Path $targetDir -Filter *.csv | ForEach-Object { # 导入当前CSV内容 $csvContent = Import-Csv -Path $_.FullName -Delimiter "," # 获取当前文件的名称 $fileName = $_.Name # 添加Filename列并覆盖原文件(-Force 确保能覆盖已有文件) $csvContent | Select-Object *, @{Name='Filename'; Expression={$fileName}} | Export-Csv -Path $_.FullName -NoTypeInformation -Delimiter "," -Force } # ② 合并所有CSV文件为单个文件,同时③ 仅保留第一个文件的表头 # 生成带时间戳的合并文件名,避免重复 $mergedFileName = "Merged_$(Get-Date -Format 'yyyyMMddHHmmss').csv" $mergedFilePath = Join-Path -Path $targetDir -ChildPath $mergedFileName # 获取目录下所有CSV文件列表 $csvFiles = Get-ChildItem -Path $targetDir -Filter *.csv # 遍历文件:第一个文件写入表头+内容,后续文件只追加内容(自动跳过表头) foreach ($index in 0..($csvFiles.Count - 1)) { $currentFile = $csvFiles[$index] $fileContent = Import-Csv -Path $currentFile.FullName -Delimiter "," if ($index -eq 0) { # 第一个文件,完整写入表头和内容 $fileContent | Export-Csv -Path $mergedFilePath -NoTypeInformation -Delimiter "," } else { # 后续文件,仅追加内容(-Append 参数会自动匹配列结构,跳过表头) $fileContent | Export-Csv -Path $mergedFilePath -NoTypeInformation -Delimiter "," -Append } } Write-Host "操作全部完成!合并后的文件路径:$mergedFilePath"
脚本各步骤详解
步骤①:添加Filename列
遍历目录下所有CSV文件,用Import-Csv读取内容后,通过Select-Object新增一个计算列Filename,值就是当前文件的名称,最后用Export-Csv覆盖原文件。-NoTypeInformation参数是为了避免在CSV开头生成PowerShell类型信息,保证CSV格式干净。步骤②+③:合并CSV并保留单个表头
首先生成一个带时间戳的合并文件名,防止重复。然后遍历所有CSV文件:第一个文件完整写入(包含表头),后续文件用-Append参数追加内容——因为Export-Csv在追加时会自动匹配目标文件的列结构,不会重复写入表头,刚好满足你“仅保留第一个原文件表头”的要求。
单纯合并多个CSV的简化脚本
如果只是需要合并CSV,不需要先添加Filename列,用这个更简洁的版本:
$targetDir = Get-Location $mergedFileName = "SimpleMerged_$(Get-Date -Format 'yyyyMMddHHmmss').csv" $mergedFilePath = Join-Path -Path $targetDir -ChildPath $mergedFileName $csvFiles = Get-ChildItem -Path $targetDir -Filter *.csv foreach ($index in 0..($csvFiles.Count - 1)) { $currentFile = $csvFiles[$index] $fileContent = Import-Csv -Path $currentFile.FullName -Delimiter "," if ($index -eq 0) { $fileContent | Export-Csv -Path $mergedFilePath -NoTypeInformation -Delimiter "," } else { $fileContent | Export-Csv -Path $mergedFilePath -NoTypeInformation -Delimiter "," -Append } } Write-Host "合并完成!文件路径:$mergedFilePath"
注意事项
- 确保所有CSV文件的列结构完全一致,否则合并后可能出现数据错位或额外列的问题。
- 如果你的CSV用的是其他分隔符(比如分号
;),只需要修改脚本里的-Delimiter参数即可。 - 脚本默认使用当前目录,如需指定其他目录,把
$targetDir的值改成目标路径,比如$targetDir = "C:\MyCSVFiles"。
内容的提问来源于stack exchange,提问作者Dabbous
相关产品推荐
相关产品推荐

