返回列表 发帖

回复 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个变量(仅实验到百万)对
系统的运行不会造成明显的影响。因此,设置变量法还是合适处理海量的数据的。
  下面给出本人的解:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
    for %%b in (%%a) do set "a=####%%b"&set "_!a:~-4!=a"
)
for /f "tokens=1 delims=#_=" %%a in ('set _') do (
     set /a n+=1,m=n%%6
     set /p=%%a        <nul>>b.txt
     if !m! equ 0 echo.>>b.txt
)
start b.txtCOPY
  
***共同提高***

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万行
代码一、
for /f "delims=" %%a in ('findstr .* a.txt') do echo %%aCOPY
代码二、
findstr .* a.txt>b.txt
for /f "delims=" %%a in (b.txt) do echo %%aCOPY
回复 32 楼 楼主
设置变量的方法确实好,不过有一个缺点是无法处理重复的数字
在实际应用中,对大量的数字排序,不重复的数字应该不多吧。。^_^
技术问题请到论坛发帖求助!

TOP

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

[ 本帖最后由 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
@echo off
Setlocal EnableDelayedExpansion
Set fs=1.txt
Set dt=2.txt
Set tf=db-tmp.txt
Set lenb=1
Set "o=>>%tf%"
call :sizehex %fs%
call :consoledb %fs%
::scan file1
%o% echo s 100 %size% 20
%o% echo q
start /w debug ^<%tf% ^>db-out.txt
::edit file1
call :consoledb %fs%
for /f "eol=- tokens=2 delims=:" %%a in (db-out.txt) do (
if defined old (
set /a len=0x%%a-old-1
set /a old=0x%%a
if !len! GTR !lenb! Set /a lenb=len
) else (
set /a old=0x%%a
)
%o% echo e %%a
%o% echo 0A
)
%o% echo w
%o% echo q
start /w debug ^<%tf%
::output
call :fined >%dt%
call :sizehex %dt%
call :consoledb %dt%
::scan file2
%o% echo s 100 %size% 0D
%o% echo q
start /w debug ^<%tf% ^>db-out.txt
::edit file2
call :consoledb %dt%
for /f "eol=- tokens=2 delims=:" %%a in (db-out.txt) do (
set /a count+=1,line=count%%6
if !line! NEQ 0 (
%o% echo e %%a
%o% echo 20 20
)
)
%o% echo w
%o% echo q
start /w debug ^<%tf%
pause
del db-???.txt
goto :eof
:fined
set reg=%reg%[0-9]
if %lenb% EQU 0 goto :eof
set /a lenb-=1
more %fs%|findstr /b /e %reg%|sort
call :fined
goto :eof
:consoledb
>%tf% cd.
%o% echo n%1
%o% echo l
goto :eof
:sizehex
set /a size=%~z1/16*10
goto :eofCOPY

TOP

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

TOP

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

那个我不懂嘿嘿

TOP

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

TOP

返回列表