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

如何用批处理脚本合并同格式CSV并添加文件名作为最后字段

批量合并CSV文件并添加来源文件名的批处理脚本优化

我们需要将目录下格式统一的多个CSV文件合并为单个文件,核心需求如下:

  • 仅保留一份表头,避免重复写入
  • 在每一行末尾新增File Name列,记录该行数据的来源文件名

示例说明

File1.csv 内容:

C1  C2
--  --  
AR1 BR1 
AR2 BR2 

File2.csv 内容:

C1  C2
--  --
CR1 DR1 
CR2 DR2 

期望合并后的文件内容:

C1  C2  File Name
--- --- ---------
AR1 BR1 File1
AR2 BR2 File1
CR1 DR1 File2
CR2 DR2 File2

现有脚本问题

现有批处理脚本可实现无重复表头的CSV合并,但缺少为每行添加来源文件名的功能,原脚本如下:

@ECHO OFF
pushd C:\Users\Ak\Desktop\Test\New folder
SET first=y
SET newfile=Merge_CSV_HB_R5217476_REDReport.csv
for %%F in (*.csv) do IF NOT %%F==%newfile% (
    if defined first (
        COPY /y "%%F" %newfile% >nul
        set "first="
    ) else (
        FOR /f "skip=1delims=" %%i IN (%%F) DO >> %newfile% ECHO %%i
    )
)

修改后的完整脚本

以下是完善后的脚本,实现了添加来源文件名的功能:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
pushd C:\Users\Ak\Desktop\Test\New folder
SET first=y
SET newfile=Merge_CSV_HB_R5217476_REDReport.csv

:: 清空已存在的合并文件,避免重复运行时内容叠加
IF EXIST "%newfile%" DEL "%newfile%"

for %%F in (*.csv) do IF NOT %%F==%newfile% (
    if defined first (
        :: 处理第一个文件:修改表头并添加文件名列
        FOR /f "delims=" %%i IN ("%%F") DO (
            SET "line=%%i"
            IF "!first!"=="y" (
                ECHO !line!  File Name>>"%newfile%"
                SET "first="
            ) ELSE (
                ECHO !line!  %%~nF>>"%newfile%"
            )
        )
    ) else (
        :: 处理后续文件:跳过表头,每行追加来源文件名
        FOR /f "skip=1 delims=" %%i IN ("%%F") DO (
            ECHO %%i  %%~nF>>"%newfile%"
        )
    )
)

popd
ENDLOCAL

关键改动说明

  1. 启用延迟变量扩展:添加SETLOCAL ENABLEDELAYEDEXPANSION,确保循环内变量能实时更新
  2. 表头处理:读取第一个文件的第一行,在末尾追加File Name作为新列名;该文件的后续数据行追加不带扩展名的文件名(%%~nF)
  3. 后续文件处理:跳过第一行表头,直接读取数据行并在末尾追加当前文件名
  4. 初始化目标文件:脚本开头删除已存在的合并文件,避免重复运行时内容累积

内容的提问来源于stack exchange,提问作者ulin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:38:16