标题: [文本处理] [已解决]批处理for循环怎样更快生产字典? [打印本页]
作者: user11 时间: 2011-5-5 05:44 标题: [已解决]批处理for循环怎样更快生产字典?
本帖最后由 user11 于 2011-5-6 16:32 编辑
最近再制作字典,没有找到合适的软件,只好自己用批处理实现,但是效率太低,求高手指教
有两个文本文件,分别为1.txt 和2.txt
1.txt内容为字母
- zhao
- qian
- sun
- li
- wu
- wang
- apple
- red
- black
- apple
- orange
2.txt内容为生日
- for /f %%i in (1.txt) do (for /f %%j in (2.txt) do echo %%i%%j>>dict.txt)
复制代码
这个效率好慢,如果文本较大要很久,请问高手有没有更快的方法。。?/
问题2:
批处理如何生成数列 如
00000
00001
00002
00003
下面的代码循环可实现,效率也比较低,求更好的方法- @echo off
- for /l %%a in (0,1,9) do (
- for /l %%b in (0,1,9) do (
- for /l %%c in (0,1,9) do (
- echo %%a%%b%%c>>1.txt
- )
- )
- )
- pause
复制代码
另外,还想实现,生成固定位数的字典,比如6位 8位,遇到字母位数不足,可以以数字补齐正在研究,欢迎指教!!
作者: hfg1977 时间: 2011-5-5 13:18
"效率好慢" 是由于频繁的对硬盘进行读写动作造成的, 尽可能的减少就会好些.- for /f %%i in (1.txt) do (set 1_%%i=%%i)
- for /f %%i in (2.txt) do (set 2_%%i=%%i)
-
- for /f "tokens=* delims=" %%a in ('set 1_') do (
- for /f "tokens=* delims=" %%A in ('set 2_') do (
- echo %%a%%A>>dict.txt
- ))
复制代码
上面代码缺陷在于CMD的变量有个数及不可使用某些特殊字符限制. 当然可以更改"1_%%i"名称使其合法化.- for /f %%i in (1.txt) do (
- sed "s/^/%%i/" 2.txt>>dict.txt
- )
复制代码
使用第三方,效率提高n倍.
作者: hfg1977 时间: 2011-5-5 13:26
RE:2
字典及其生成工具被hack广泛使用, 建议LZ用用.
作者: user11 时间: 2011-5-5 22:50
"效率好慢" 是由于频繁的对硬盘进行读写动作造成的, 尽可能的减少就会好些.
for /f %%i in (1.txt) do (set 1_%%i=%%i)
for /f %%i in (2.txt) do (set 2_%%i=%%i)
for /f "tokens=* delims=" %%a in ('set 1_' ...
hfg1977 发表于 2011-5-5 13:18
非常感谢。。。可否告知, 不用 for嵌套 是否还有别的方法可以生成0000 0001之类的序列,或者生成生日0109 0123之类的 谢谢
作者: hfg1977 时间: 2011-5-6 01:37
无论哪种语言要实现你的目的,都离不开循环体语法结构,仅是循环方法不同而已.- @echo off
- setlocal enabledelayedexpansion&cls
- :{计算耗时(不考虑小时) 10:35:31.42 [放在开头]
- :: (m*60+s)*1000+s'*10=ms 毫秒
- ::取余去零操作
- set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
- set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
- set /a time_start=(%m%*60 + %s%)*1000 + %ss%*10
- :}
-
- for /l %%a in (0,1,9) do (
- for /l %%b in (0,1,9) do (
- for /l %%c in (0,1,9) do (
- for /l %%d in (0,1,9) do (
- echo %%a%%b%%c%%d>>1.txt
- ))))
-
- :{计算耗时(不考虑小时) 10:35:31.42 [放在结尾]
- set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
- set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
- set /a time_end=(%m%*60 + %s%)*1000 + %ss%*10
- set /a time_lost=%time_end%-%time_start%
- ::echo ::耗时: %time_lost%ms (毫秒)>>"%FILENAME%"
- echo 耗时: %time_lost%ms (毫秒)>>1.txt
- :}
复制代码
- @echo off
- setlocal enabledelayedexpansion&cls
- :{计算耗时(不考虑小时) 10:35:31.42 [放在开头]
- :: (m*60+s)*1000+s'*10=ms 毫秒
- ::取余去零操作
- set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
- set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
- set /a time_start=(%m%*60 + %s%)*1000 + %ss%*10
- :}
-
- set/a NUM=0
- for /l %%i in (1,1,10000) do (
- set/a NUM+=1
- set _!NUM!=0000%%i
- call set _!NUM!=%%_!NUM!:~-4%%
- set/a fag=NUM %% 10
- if !fag! EQU 0 (
- echo !_1!
- echo !_2!
- echo !_3!
- echo !_4!
- echo !_5!
- echo !_6!
- echo !_7!
- echo !_8!
- echo !_9!
- echo !_10!
- set/a NUM=0
- )>>youFname.txt
- )
-
- :{计算耗时(不考虑小时) 10:35:31.42 [放在结尾]
- set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
- set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
- set /a time_end=(%m%*60 + %s%)*1000 + %ss%*10
- set /a time_lost=%time_end%-%time_start%
- ::echo ::耗时: %time_lost%ms (毫秒)>>"%FILENAME%"
- echo 耗时: %time_lost%ms (毫秒)>>youFname.txt
- :}
复制代码
第一种方法耗时: 2740ms (毫秒)
第二种方法耗时: 51440ms (毫秒)
慢了20倍,还不如老方法呢, 没尝试扩大模数,改成100行写入一次??
1W行3秒写好,可以了呀.
作者: CrLf 时间: 2011-5-6 12:48
减少句柄的重定向次数可以减少用时:- @echo off
- (for /l %%a in (0,1,9) do (
- for /l %%b in (0,1,9) do (
- for /l %%c in (0,1,9) do (
- echo %%a%%b%%c
- )
- )
- ))>1.txt
- pause
复制代码
另外一种思路:- @echo off
- %1 echo %time%
- %1 %0 :: |find /v "" >1.txt
- for /l %%a in (1 1 10000) do echo %%a
- echo>con %time%
- pause
复制代码
作者: hfg1977 时间: 2011-5-6 14:24
- @echo off
- setlocal enabledelayedexpansion&cls
- :{计算耗时(不考虑小时) 10:35:31.42 [放在开头]
- :: (m*60+s)*1000+s'*10=ms 毫秒
- ::取余去零操作
- set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
- set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
- set /a time_start=(%m%*60 + %s%)*1000 + %ss%*10
- :}
-
- (for /l %%a in (0,1,9) do (
- for /l %%b in (0,1,9) do (
- for /l %%c in (0,1,9) do (
- for /l %%d in (0,1,9) do (
- echo %%a%%b%%c%%d
- )))))>1.txt
-
- :{计算耗时(不考虑小时) 10:35:31.42 [放在结尾]
- set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
- set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
- set /a time_end=(%m%*60 + %s%)*1000 + %ss%*10
- set /a time_lost=%time_end%-%time_start%
- ::echo ::耗时: %time_lost%ms (毫秒)>>"%FILENAME%"
- echo 耗时: %time_lost%ms (毫秒)>>1.txt
- :}
复制代码
耗时: 270ms (毫秒)
快了10倍哦.
作者: user11 时间: 2011-5-6 16:26
真的非常感谢楼上两位,
还没有完全理解,为什么可以一次性写入1.txt 我研究一下 生成个6位数字典试试
谢谢了~
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |