Batch中如何用for循环处理单行文本实现分类两列无重复输出?
问题原因
你写的嵌套for循环会全量遍历文件两次,外层每读取到一个条目,内层都会遍历所有另一类的条目输出,自然会产生大量重复内容,完全无法实现按顺序配对的需求。另外你设置的eol参数逻辑也有问题:eol=*代表跳过所有以*开头的行,外层循环根本读不到水果条目。
修正后的批处理代码
@echo off setlocal enabledelayedexpansion :: 先按顺序读取所有动物条目,存入带索引的变量 set "ani_idx=0" for /f "useback tokens=*" %%l in ("my text.txt") do ( set "line=%%l" if "!line:~0,1!"=="#" ( for /f "tokens=2 delims= " %%n in ("%%l") do ( set "ani_!ani_idx!=%%n" set /a ani_idx+=1 ) ) ) :: 按顺序读取水果条目,和对应索引的动物配对输出 set "fruit_idx=0" for /f "useback tokens=*" %%l in ("my text.txt") do ( set "line=%%l" if "!line:~0,1!"=="*" ( if defined ani_!fruit_idx! ( for /f "tokens=2 delims= " %%n in ("%%l") do ( echo * %%n # !ani_%fruit_idx%! set /a fruit_idx+=1 ) ) ) ) endlocal
代码说明
- 开启延迟变量扩展,解决批处理循环内变量动态更新的问题
- 第一次遍历文件,把所有
#开头的动物名称按读取顺序存入ani_0、ani_1这类带索引的变量中 - 第二次遍历文件,读取所有
*开头的水果名称,每读到一个就取相同索引的动物名称配对输出 - 水果数量多于动物时,多余的水果会自动忽略,和你给出的示例效果完全匹配
- 如果需要调整两列的对齐间距,直接修改
echo行里两个条目之间的空格数量即可
内容的提问来源于stack exchange,提问作者Rohit prasad
相关产品推荐
相关产品推荐

