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

如何用单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:21:27