如何用批处理脚本合并同格式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
关键改动说明
- 启用延迟变量扩展:添加
SETLOCAL ENABLEDELAYEDEXPANSION,确保循环内变量能实时更新 - 表头处理:读取第一个文件的第一行,在末尾追加
File Name作为新列名;该文件的后续数据行追加不带扩展名的文件名(%%~nF) - 后续文件处理:跳过第一行表头,直接读取数据行并在末尾追加当前文件名
- 初始化目标文件:脚本开头删除已存在的合并文件,避免重复运行时内容累积
内容的提问来源于stack exchange,提问作者ulin
相关产品推荐
相关产品推荐

