标题: [文本处理] [已解决]for命令嵌套问题请教,楼下加了一个嵌套优化问题 [打印本页]
作者: loquat 时间: 2011-11-15 13:17 标题: [已解决]for命令嵌套问题请教,楼下加了一个嵌套优化问题
本帖最后由 loquat 于 2011-11-15 14:05 编辑
我有一个文件,多行,各行格式如下- AD;编号;A;;B;;;;;;;;;;;C;;;;
复制代码
我想把“编号”改成从0开始步进1的数字- AD;0;A;;B;;;;;;;;;;;C;;;;
- AD;1;A;;B;;;;;;;;;;;C;;;;
复制代码
于是我写了如下代码- setlocal enabledelayedexpansion
- for /f "tokens=1,2* delims=; " %%i in (1.txt) do (
- for /l %%a in (0,1,10) do (
- set var=%%a
- echo %%i;!var!;%%k >>out.txt
- )
- )
复制代码
这段代码各行都要循环11次,怎么让每行只输出一次?
作者: CrLf 时间: 2011-11-15 13:29
回复 1# loquat
那两个循环是父子关系,循环次数当然是 父循环*子循环了...- @echo off&setlocal enabledelayedexpansion
- set n=0
- (for /f "tokens=1,2* delims=; " %%i in (1.txt) do (
- echo %%i;!n!;%%k
- set /a n+=1
- ))>out.txt
复制代码
如果非要嵌套,那要反过来,让单循环的 for /f 在内,for /l 在外:- @echo off&setlocal enabledelayedexpansion
- (for /l %%a in (0 1 11) do (
- set /p var=
- for /f "tokens=1,2* delims=; " %%i in ("!var!") do echo %%i;%%a;%%k
- ))<1.txt>out.txt
复制代码
作者: loquat 时间: 2011-11-15 13:50
我自己看了论坛帖子解决了
不过效率没有你的代码高,谢谢了
作者: loquat 时间: 2011-11-15 14:01
这个也是嵌套的问题- @echo off
- for /f "tokens=1,2,3*" %%i in (1.txt) do (
- for /f "tokens=1,2,3*" %%o in (2.txt) do (
- if %%i==%%o echo %%i %%j %%k %%r >>out.txt
- )
- )
复制代码
两个文件格式都相同复制代码
代码是把2.txt的D部分替换到1.txt
不知道效率可否提高?
作者: loquat 时间: 2011-11-15 14:02
A是编号,所以各行的A都不同
作者: CrLf 时间: 2011-11-15 16:33
这种嵌套方式在文件大时会慢得可怕,因为它是指数级的,循环次数是内外相乘,我们对算法进行优化时,最主要的手段就是将指数级的循环方式用算术级的循环来实现,比如:- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,3 delims=:;" %%a in (2.txt) do set @%%a=%%b
- for /f "tokens=1,2 delims=:" %%a in (1.txt) do echo %%a:%%b;!@%%a!
- pause
- ::使用两个并联的同级循环,而非串联的父子循环,这样可以大大节约循环次数
复制代码
2.txt 如果与 1.txt 严格一一对应的话,也可以用单循环:- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=;" %%a in (1.txt) do (
- set /p str=
- echo %%a;!str:*;=!
- ))<2.txt
- pause
复制代码
作者: loquat 时间: 2011-11-15 22:33
回复 6# CrLf
其实文件格式是这样的- 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
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |