Windows batch脚本实现两CSV首列匹配 从大列数文件追加指定列
解决Windows批处理匹配CSV列追加内容问题
原代码存在的问题
- 仅读取File1的前5列,无法完整保留File1所有原有字段
- 嵌套循环效率极低,大文件场景下运行速度会非常慢
- for /f 循环变量仅支持单字母命名,直接读取到第51个变量的写法繁琐容易出错
- 未处理表头行,会导致输出表头缺失追加的5列表头
可行批处理方案
实现思路:先遍历File2,将第一列作为索引键,预存对应行的第47-51列内容到内存,再遍历File1逐行匹配追加,效率更高逻辑更清晰。
@echo off setlocal enabledelayedexpansion :: 此处修改为你的实际文件路径 set "file1=F:\testscript\employeenetchange\csv\test1.csv" set "file2=F:\testscript\employeenetchange\csv\test2.csv" set "output=F:\testscript\employeenetchange\csv\newfile3.csv" :: 先清空输出文件 type nul > "%output%" :: 第一步:遍历File2,预存第一列对应的第47-51列内容 for /f "skip=1 tokens=1,47-51 delims=," %%a in ('type "%file2%"') do ( set "key=%%a" set "append_str=%%b,%%c,%%d,%%e,%%f" :: 把内容存入以key为名称的变量 set "map_!key!=!append_str!" ) :: 第二步:处理表头行单独追加File2的47-51列表头 set /p header2=<"%file2%" set "header_append=" for /f "tokens=47-51 delims=," %%a in ("!header2!") do set "header_append=%%a,%%b,%%c,%%d,%%e" set /p first_line=<"%file1%" echo !first_line!,!header_append!>>"%output%" :: 第三步:遍历File1逐行匹配追加内容 for /f "skip=1 delims=" %%a in ('type "%file1%"') do ( set "line=%%a" :: 提取当前行第一列作为匹配键 for /f "tokens=1 delims=," %%k in ("!line!") do ( :: 匹配到则追加,未匹配到保留原行 if defined map_%%k ( echo !line!,!map_%%k!>>"%output%" ) else ( echo !line!>>"%output%" ) ) ) echo 处理完成,输出文件路径:%output% pause
注意事项
- 本方案仅适用于CSV字段内不包含逗号、引号的场景,如果你的CSV存在带逗号的引用字段,建议使用PowerShell或者Python处理更稳妥
- 如果File2存在第一列重复的行,默认会以最后一次出现的行的47-51列内容为准
- 文件路径如果包含空格,请确保全程用双引号包裹路径
内容的提问来源于stack exchange,提问作者sandeep himgire
相关产品推荐
相关产品推荐

