[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]for命令嵌套问题请教,楼下加了一个嵌套优化问题

本帖最后由 loquat 于 2011-11-15 14:05 编辑

我有一个文件,多行,各行格式如下
  1. AD;编号;A;;B;;;;;;;;;;;C;;;;
复制代码
我想把“编号”改成从0开始步进1的数字
  1. AD;0;A;;B;;;;;;;;;;;C;;;;
  2. AD;1;A;;B;;;;;;;;;;;C;;;;
复制代码
于是我写了如下代码
  1. setlocal enabledelayedexpansion
  2. for /f "tokens=1,2* delims=; " %%i in (1.txt) do (
  3. for /l %%a in (0,1,10) do (
  4. set var=%%a
  5. echo %%i;!var!;%%k >>out.txt
  6. )
  7. )
复制代码
这段代码各行都要循环11次,怎么让每行只输出一次?
1

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# loquat


    那两个循环是父子关系,循环次数当然是 父循环*子循环了...
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=0
  3. (for /f "tokens=1,2* delims=; " %%i in (1.txt) do (
  4.    echo %%i;!n!;%%k
  5.    set /a n+=1
  6. ))>out.txt
复制代码
如果非要嵌套,那要反过来,让单循环的 for /f 在内,for /l 在外:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in (0 1 11) do (
  3.    set /p var=
  4.    for /f "tokens=1,2* delims=; " %%i in ("!var!") do echo %%i;%%a;%%k
  5. ))<1.txt>out.txt
复制代码

TOP

我自己看了论坛帖子解决了
不过效率没有你的代码高,谢谢了

TOP

这个也是嵌套的问题
  1. @echo off
  2. for /f "tokens=1,2,3*" %%i in (1.txt) do (
  3. for /f "tokens=1,2,3*" %%o in (2.txt) do (
  4.   if %%i==%%o echo %%i %%j %%k %%r >>out.txt
  5. )
  6. )
复制代码
两个文件格式都相同
  1. A: B C ;D
复制代码
代码是把2.txt的D部分替换到1.txt

不知道效率可否提高?

TOP

A是编号,所以各行的A都不同

TOP

这种嵌套方式在文件大时会慢得可怕,因为它是指数级的,循环次数是内外相乘,我们对算法进行优化时,最主要的手段就是将指数级的循环方式用算术级的循环来实现,比如:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,3 delims=:;" %%a in (2.txt) do set @%%a=%%b
  3. for /f "tokens=1,2 delims=:" %%a in (1.txt) do echo %%a:%%b;!@%%a!
  4. pause
  5. ::使用两个并联的同级循环,而非串联的父子循环,这样可以大大节约循环次数
复制代码
2.txt 如果与 1.txt 严格一一对应的话,也可以用单循环:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=;" %%a in (1.txt) do (
  3.    set /p str=
  4.    echo %%a;!str:*;=!
  5. ))<2.txt
  6. pause
复制代码

TOP

回复 6# CrLf
其实文件格式是这样的
  1. 0448: 00000000 94300020 ; 112: void* memset( void* mem, char chr, int size );
复制代码
代码1,根据要求自己修改了,可用

代码2,输出错位了
第二行的注释输出到第一行去了
@echo off&setlocal enabledelayedexpansion
(for /f "delims=;" %%a in (1.vkp) do (
   set /p str=
   echo %%a;!str:*;=!
))<2.vkp>out.txt
pause

TOP

返回列表