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

[文本处理] [已解决]批处理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内容为生日




  • 0101
  • 0102
  • 0103
  • 1230
  • 1231
  1. for /f %%i in (1.txt) do (for /f %%j in (2.txt) do echo %%i%%j>>dict.txt)
复制代码
这个效率好慢,如果文本较大要很久,请问高手有没有更快的方法。。?/

问题2:

批处理如何生成数列 如
00000
00001
00002
00003
下面的代码循环可实现,效率也比较低,求更好的方法
  1. @echo off
  2. for /l %%a in (0,1,9) do (
  3. for /l %%b in (0,1,9) do (
  4. for /l %%c in (0,1,9) do (
  5. echo %%a%%b%%c>>1.txt
  6. )
  7. )
  8. )
  9. pause
复制代码
另外,还想实现,生成固定位数的字典,比如6位 8位,遇到字母位数不足,可以以数字补齐正在研究,欢迎指教!!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
努力学习

"效率好慢" 是由于频繁的对硬盘进行读写动作造成的, 尽可能的减少就会好些.
  1. for /f %%i in (1.txt) do (set 1_%%i=%%i)
  2. for /f %%i in (2.txt) do (set 2_%%i=%%i)
  3. for /f "tokens=* delims=" %%a in ('set 1_') do (
  4. for /f "tokens=* delims=" %%A in ('set 2_') do (
  5. echo %%a%%A>>dict.txt
  6. ))
复制代码
上面代码缺陷在于CMD的变量有个数及不可使用某些特殊字符限制. 当然可以更改"1_%%i"名称使其合法化.
  1. for /f %%i in (1.txt) do (
  2. sed "s/^/%%i/" 2.txt>>dict.txt
  3. )
复制代码
使用第三方,效率提高n倍.

TOP

RE:2
字典及其生成工具被hack广泛使用, 建议LZ用用.

TOP

"效率好慢" 是由于频繁的对硬盘进行读写动作造成的, 尽可能的减少就会好些.
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之类的 谢谢
努力学习

TOP

无论哪种语言要实现你的目的,都离不开循环体语法结构,仅是循环方法不同而已.
  1. @echo off
  2. setlocal enabledelayedexpansion&cls
  3. :{计算耗时(不考虑小时) 10:35:31.42  [放在开头]
  4. ::    (m*60+s)*1000+s'*10=ms 毫秒
  5. ::取余去零操作
  6. set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
  7. set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
  8. set /a time_start=(%m%*60 + %s%)*1000 + %ss%*10
  9. :}
  10. for /l %%a in (0,1,9) do (
  11. for /l %%b in (0,1,9) do (
  12. for /l %%c in (0,1,9) do (
  13. for /l %%d in (0,1,9) do (
  14. echo %%a%%b%%c%%d>>1.txt
  15. ))))
  16. :{计算耗时(不考虑小时) 10:35:31.42  [放在结尾]
  17. set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
  18. set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
  19. set /a time_end=(%m%*60 + %s%)*1000 + %ss%*10
  20. set /a time_lost=%time_end%-%time_start%
  21. ::echo ::耗时: %time_lost%ms (毫秒)>>"%FILENAME%"
  22. echo 耗时: %time_lost%ms (毫秒)>>1.txt
  23. :}
复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion&cls
  3. :{计算耗时(不考虑小时) 10:35:31.42  [放在开头]
  4. ::    (m*60+s)*1000+s'*10=ms 毫秒
  5. ::取余去零操作
  6. set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
  7. set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
  8. set /a time_start=(%m%*60 + %s%)*1000 + %ss%*10
  9. :}
  10. set/a NUM=0
  11. for /l %%i in (1,1,10000) do (
  12. set/a NUM+=1
  13. set _!NUM!=0000%%i
  14. call set _!NUM!=%%_!NUM!:~-4%%
  15. set/a fag=NUM %% 10
  16. if !fag! EQU 0 (
  17. echo !_1!
  18. echo !_2!
  19. echo !_3!
  20. echo !_4!
  21. echo !_5!
  22. echo !_6!
  23. echo !_7!
  24. echo !_8!
  25. echo !_9!
  26. echo !_10!
  27. set/a NUM=0
  28. )>>youFname.txt
  29. )
  30. :{计算耗时(不考虑小时) 10:35:31.42  [放在结尾]
  31. set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
  32. set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
  33. set /a time_end=(%m%*60 + %s%)*1000 + %ss%*10
  34. set /a time_lost=%time_end%-%time_start%
  35. ::echo ::耗时: %time_lost%ms (毫秒)>>"%FILENAME%"
  36. echo 耗时: %time_lost%ms (毫秒)>>youFname.txt
  37. :}
复制代码
第一种方法耗时: 2740ms (毫秒)
第二种方法耗时: 51440ms (毫秒)
慢了20倍,还不如老方法呢, 没尝试扩大模数,改成100行写入一次??

1W行3秒写好,可以了呀.
1

评分人数

TOP

减少句柄的重定向次数可以减少用时:
  1. @echo off
  2. (for /l %%a in (0,1,9) do (
  3.    for /l %%b in (0,1,9) do (
  4.       for /l %%c in (0,1,9) do (
  5.          echo %%a%%b%%c
  6.       )
  7.    )
  8. ))>1.txt
  9. pause
复制代码
另外一种思路:
  1. @echo off
  2. %1 echo %time%
  3. %1 %0 :: |find /v "" >1.txt
  4. for /l %%a in (1 1 10000) do echo %%a
  5. echo>con %time%
  6. pause
复制代码
1

评分人数

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion&cls
  3. :{计算耗时(不考虑小时) 10:35:31.42  [放在开头]
  4. ::    (m*60+s)*1000+s'*10=ms 毫秒
  5. ::取余去零操作
  6. set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
  7. set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
  8. set /a time_start=(%m%*60 + %s%)*1000 + %ss%*10
  9. :}
  10. (for /l %%a in (0,1,9) do (
  11. for /l %%b in (0,1,9) do (
  12. for /l %%c in (0,1,9) do (
  13. for /l %%d in (0,1,9) do (
  14. echo %%a%%b%%c%%d
  15. )))))>1.txt
  16. :{计算耗时(不考虑小时) 10:35:31.42  [放在结尾]
  17. set "m=%time:~3,2%"&set "s=%time:~6,2%"&set "ss=%time:~-2%"
  18. set /a m=1%m% "%%" 100,s=1%s% "%%" 100,ss=1%ss% "%%" 100
  19. set /a time_end=(%m%*60 + %s%)*1000 + %ss%*10
  20. set /a time_lost=%time_end%-%time_start%
  21. ::echo ::耗时: %time_lost%ms (毫秒)>>"%FILENAME%"
  22. echo 耗时: %time_lost%ms (毫秒)>>1.txt
  23. :}
复制代码
耗时: 270ms (毫秒)
快了10倍哦.

TOP

真的非常感谢楼上两位,

还没有完全理解,为什么可以一次性写入1.txt 我研究一下 生成个6位数字典试试


谢谢了~
努力学习

TOP

返回列表