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

如何扩展现有Batch脚本实现多TXT关联数据合并到CSV

批处理脚本完善:多TXT文件合并为关联CSV

用户有四个TXT文件:TestEmployees.txt(存储Name)、TestSign.txt(存储Name与Sign的对应关系)、RoomNumber.txt(存储Sign与RoomNumber的对应关系)、PhoneNumber.txt(存储Sign与PhoneNumber的对应关系),需要将这些数据合并为一个CSV文件,列标题为Name;Sign;RoomNumber;PhoneNumber,关联规则为:Name对应Sign,Sign对应RoomNumber和PhoneNumber。现有脚本仅能生成前两列,以下是完善后的代码:

@echo off
setlocal enabledelayedexpansion

:: 初始化CSV文件,写入列标题
echo Name;Sign;RoomNumber;PhoneNumber > sorted.csv

:: 遍历TestEmployees.txt中的Name(取第二列)
for /f "tokens=2 delims= " %%x in (TestEmployees.txt) do (
    call :findSignAndDetails "%%x"
)

endlocal
exit /b

:findSignAndDetails
set "name=%~1"
set "sign="
set "room="
set "phone="

:: 从TestSign.txt中匹配Name对应的Sign
for /f "tokens=1,2 delims= " %%a in (TestSign.txt) do (
    if "!name!"=="%%a" (
        set "sign=%%b"
        goto :findRoomPhone  :: 找到Sign后直接跳去匹配房间和电话
    )
)

:findRoomPhone
:: 从RoomNumber.txt中匹配Sign对应的RoomNumber
if not "!sign!"=="" (
    for /f "tokens=1,2 delims= " %%c in (RoomNumber.txt) do (
        if "!sign!"=="%%c" (
            set "room=%%d"
            goto :findPhone  :: 找到房间后跳去匹配电话
        )
    )
)

:findPhone
:: 从PhoneNumber.txt中匹配Sign对应的PhoneNumber
if not "!sign!"=="" (
    for /f "tokens=1,2 delims= " %%e in (PhoneNumber.txt) do (
        if "!sign!"=="%%e" (
            set "phone=%%f"
            goto :outputLine  :: 找到电话后跳去输出行
        )
    )
)

:outputLine
:: 输出一行数据,未找到的字段留空
echo !name!;!sign!;!room!;!phone! >> sorted.csv

:: 结束子程序,返回主循环
goto :eof

关键修改说明

  • 启用延迟变量扩展:通过setlocal enabledelayedexpansion解决循环内变量更新无法实时读取的问题
  • 整合匹配逻辑:将Sign、RoomNumber、PhoneNumber的匹配流程整合到一个子程序中,避免代码冗余
  • 优化匹配效率:找到对应值后立即用goto跳出循环,无需遍历整个文件
  • 空值处理:初始化变量为空,确保未找到对应数据时,CSV对应列留空,保证格式正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:50:20