如何用批处理提取<Path>标签内容并合并对应<Channel>行?
解决方案:直接提取标签内容并合并匹配条目
没问题,咱们可以简化你的批处理流程,不用生成一堆中间文件,直接从Analysis.gla里提取<Path>标签内的内容,筛选出<Channel>1</Channel>的条目,还能按需合并对应内容。下面分两种场景给你代码:
场景1:只合并第一个匹配的Path和Channel=1的内容
如果你只需要第一个出现的<Path>内容和第一个<Channel>1</Channel>的内容合并,用这个脚本:
@echo off setlocal enabledelayedexpansion rem 初始化变量 set "targetPath=" set "targetChannel=" rem 提取第一个<Path>标签内的文本 for /f "tokens=3 delims=<>" %%a in ('findstr /i "<Path>" Analysis\Analysis.gla') do ( if not defined targetPath set "targetPath=%%a" ) rem 提取第一个<Channel>1</Channel>标签内的文本 for /f "tokens=3 delims=<>" %%b in ('findstr /i "<Channel>1</Channel>" Analysis\Analysis.gla') do ( if not defined targetChannel set "targetChannel=%%b" ) rem 合并输出(如果都找到的话) if defined targetPath if defined targetChannel ( echo 合并结果:!targetPath! | !targetChannel! echo !targetPath! | !targetChannel! > MergedResult.txt echo 已保存到MergedResult.txt ) else ( echo 错误:未找到符合条件的Path或Channel=1条目 ) endlocal
关键说明:
tokens=3 delims=<>:把<和>作为分隔符,拆分<Path>TEXT</Path>后,第3个字段就是我们要的TEXTif not defined:确保只取第一个匹配的内容,避免循环覆盖变量setlocal enabledelayedexpansion:让我们在脚本里能正确读取循环中设置的变量
场景2:匹配所有成对的Path和Channel=1条目
如果你的Analysis.gla是按组排列的(每组包含一个<Path>和一个<Channel>),需要把所有对应<Channel>1</Channel>的<Path>内容找出来合并,用这个脚本:
@echo off setlocal enabledelayedexpansion set "currentPath=" rem 逐行读取文件 for /f "delims=" %%a in (Analysis\Analysis.gla) do ( rem 检查当前行是否是<Path>行,提取内容 echo %%a | findstr /i "<Path>" >nul if not errorlevel 1 ( for /f "tokens=3 delims=<>" %%b in ("%%a") do set "currentPath=%%b" ) rem 检查当前行是否是<Channel>1</Channel>行,合并输出 echo %%a | findstr /i "<Channel>1</Channel>" >nul if not errorlevel 1 ( if defined currentPath ( echo !currentPath! | 1 >> MergedResults.txt echo 已匹配:!currentPath! | 1 ) rem 重置路径变量,避免和下一组混淆 set "currentPath=" ) ) echo 所有匹配结果已保存到MergedResults.txt endlocal
这个脚本适合的文件结构示例:
<Path>C:\Data\File1.gla</Path> <Channel>1</Channel> <Path>C:\Data\File2.gla</Path> <Channel>2</Channel> <Path>C:\Data\File3.gla</Path> <Channel>1</Channel>
运行后会输出并保存:
C:\Data\File1.gla | 1 C:\Data\File3.gla | 1
替代方案:直接修改你原来的脚本(保留中间文件)
如果你想继续用原来的中间文件思路,修改Path.txt和Channel.txt的生成逻辑,直接提取标签内的内容:
rem 直接提取<Path>标签内的内容到Path.txt for /f "tokens=3 delims=<>" %%a IN ('findstr /i "<Path>" Analysis\Analysis.gla') DO echo %%a >> Path.txt rem 直接提取<Channel>1</Channel>标签内的内容到Channel.txt for /f "tokens=3 delims=<>" %%a IN ('findstr /i "<Channel>1</Channel>" Analysis\Analysis.gla') DO echo %%a >> Channel.txt rem 合并两个文件的首行到Merged.txt set /p pathFirst=<Path.txt set /p channelFirst=<Channel.txt echo %pathFirst% | %channelFirst% > Merged.txt
内容的提问来源于stack exchange,提问作者AlexM
相关产品推荐
相关产品推荐

