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

回复 28楼 的帖子

因为 for /f + findstr 效率很低。

你说的是把findstr嵌在in里面吗?理论上效率应该不会很低吧。
应该与先将findstr的结果保存到文件,再for /f 解析文件差不多。findstr的效率不低。要实现六列一行,用for /f是必不可少的。

====================================
是在 for /f 的 in 中命令的运行方式(cmd /c command)影响效率吗?
因为要额外启动一个CMD,所以速度要慢一点。但应该不影响解析效率吧。
照这样说,所有用 for /f 解析命令输出的方法都对速度有一定影响,也就是增加了总的运行时间,折算起来就相当于降低了效率。


PS:19楼代码中 findstr /rxg:~a.txt t.txt,t.txt前面写掉了~。

[ 本帖最后由 zqz0012005 于 2009-2-27 08:49 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

&&没想到这个贴子引发了众位管理员对处理数据的一番激烈议论,各位也给出了精彩的代
码,看得我目不暇接眼花缭乱,确实是学习了。
  对于数据的处理,本人还是偏爱于设置变量法,jm说这种方法会消耗系统内存,确实是
如此,经本人亲自实验,按现在的一般机器配置,设置1000000个变量(仅实验到百万)对
系统的运行不会造成明显的影响。因此,设置变量法还是合适处理海量的数据的。
  下面给出本人的解:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.     for %%b in (%%a) do set "a=####%%b"&set "_!a:~-4!=a"
  4. )
  5. for /f "tokens=1 delims=#_=" %%a in ('set _') do (
  6.      set /a n+=1,m=n%%6
  7.      set /p=%%a        <nul>>b.txt
  8.      if !m! equ 0 echo.>>b.txt
  9. )
  10. start b.txt
复制代码
  
***共同提高***

TOP

回复 31楼 的帖子

for /f + findstr 效率很低。
应该与先将findstr的结果保存到文件,再for /f 解析文件差不多。
理论上好像是这样的,但事实不是。
findstr 无论是遍历、还是写入文件,速度都是超快的,但如果把findstr运行的结果
直接赋值给for就没有充分利用findstr命令的优势了。
事实上 for 的in 中嵌套任何命令都是影响效率的,
比如我们常用的
for /f "delims=" %%a in ('dir/b') do ......
for /f "delims=" %%a in ('set .') do ......
等等,只是在少量的数据、或少量的使用次数面前体现不出来。
废话少说,测试以下代码,应该会有所发现。
a.txt 内容至少 5万行
代码一、
  1. for /f "delims=" %%a in ('findstr .* a.txt') do echo %%a
复制代码
代码二、
  1. findstr .* a.txt>b.txt
  2. for /f "delims=" %%a in (b.txt) do echo %%a
复制代码
回复 32 楼 楼主
设置变量的方法确实好,不过有一个缺点是无法处理重复的数字
在实际应用中,对大量的数字排序,不重复的数字应该不多吧。。^_^
技术问题请到论坛发帖求助!

TOP

回楼上随风兄,我试了这样修改下能处理重复,不知通用么。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('more a.txt') do (
  3. for %%j in (%%i) do (
  4. set "num=0000%%j"&set "num=!num:~-4!"
  5. if defined _!num! (set/a m+=1&set _!num!!m!=%%j
  6. ) else set _!num!=%%j
  7. ))
  8. for /f "tokens=2 delims==" %%i in ('set _') do (
  9. <nul set/p=%%i >>b.txt
  10. set/a n+=1
  11. if !n! equ 6 echo.>>b.txt&set/a n=0
  12. )
  13. start "" "b.txt"
复制代码

[ 本帖最后由 zhouyongjun 于 2009-3-3 12:11 编辑 ]

TOP

我也练练手

@echo off&setlocal enabledelayedexpansion
(set m=
for /f "delims=" %%a in (a.txt) do (
    for %%b in (%%a) do (
        set "one=0000%%j"&set/a m+=1&set _!num:~-4!_!m!=%%j
)  )
set n=6&set str=
for /f "tokens=2 delims==" %%i in ('set _') do (
    set str=!str! !%%i
    set/a n-=1,1/n||(set n=6&echo !str!&set str=)
)
if defined str echo !str!)>b.txt
start "b.txt"

TOP

使用debug
  1. @echo off
  2. Setlocal EnableDelayedExpansion
  3. Set fs=1.txt
  4. Set dt=2.txt
  5. Set tf=db-tmp.txt
  6. Set lenb=1
  7. Set "o=>>%tf%"
  8. call :sizehex %fs%
  9. call :consoledb %fs%
  10. ::scan file1
  11. %o% echo s 100 %size% 20
  12. %o% echo q
  13. start /w debug ^<%tf% ^>db-out.txt
  14. ::edit file1
  15. call :consoledb %fs%
  16. for /f "eol=- tokens=2 delims=:" %%a in (db-out.txt) do (
  17. if defined old (
  18. set /a len=0x%%a-old-1
  19. set /a old=0x%%a
  20. if !len! GTR !lenb! Set /a lenb=len
  21. ) else (
  22. set /a old=0x%%a
  23. )
  24. %o% echo e %%a
  25. %o% echo 0A
  26. )
  27. %o% echo w
  28. %o% echo q
  29. start /w debug ^<%tf%
  30. ::output
  31. call :fined >%dt%
  32. call :sizehex %dt%
  33. call :consoledb %dt%
  34. ::scan file2
  35. %o% echo s 100 %size% 0D
  36. %o% echo q
  37. start /w debug ^<%tf% ^>db-out.txt
  38. ::edit file2
  39. call :consoledb %dt%
  40. for /f "eol=- tokens=2 delims=:" %%a in (db-out.txt) do (
  41. set /a count+=1,line=count%%6
  42. if !line! NEQ 0 (
  43. %o% echo e %%a
  44. %o% echo 20 20
  45. )
  46. )
  47. %o% echo w
  48. %o% echo q
  49. start /w debug ^<%tf%
  50. pause
  51. del db-???.txt
  52. goto :eof
  53. :fined
  54. set reg=%reg%[0-9]
  55. if %lenb% EQU 0 goto :eof
  56. set /a lenb-=1
  57. more %fs%|findstr /b /e %reg%|sort
  58. call :fined
  59. goto :eof
  60. :consoledb
  61. >%tf% cd.
  62. %o% echo n%1
  63. %o% echo l
  64. goto :eof
  65. :sizehex
  66. set /a size=%~z1/16*10
  67. goto :eof
复制代码

TOP

要是用debug的话,就就应用汇编批令完成了,搞那么多次debug调用,效率太低了一点

TOP

原帖由 netbenton 于 2009-5-2 07:31 发表
要是用debug的话,就就应用汇编批令完成了,搞那么多次debug调用,效率太低了一点

那个我不懂嘿嘿

TOP

来个效率低下的:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 10000) do (
  3.     for /f "delims=" %%b in (a.txt) do (
  4.         for %%c in (%%b) do (
  5.             if %%a equ %%c set /p= %%a<nul&set /a n+=1&if !n! equ 6 echo\&set n=0
  6. )))
  7. pause
复制代码
(*^_^*)

TOP

返回列表