Board logo

标题: 高手们帮忙优化一下代码 [打印本页]

作者: dragonamd     时间: 2008-9-12 04:51    标题: 高手们帮忙优化一下代码

R02 u70.843 i-19.91 5-10.17 I5.641 U71.796 B-18.487 5-8.11 I4.556 G75.13 H-10.666 5-9.16 I-9.209 F75.13 5-7.27 H-10.666 I-9.209 上面的这段中,5-以后的10.17数字最大了,就显示5-10.17 @echo off&setlocal enabledelayedexpansion for /f "delims=" %%a in (a.txt) do ( for %%i in (%%a) do ( set "var=%%i" if "!var:~,1!" equ "5" ( set "var= !var!" set "_!var:~-10!=%%i" ) ) ) for /f "tokens=2 delims==" %%i in ('set _') do set "max=%%i" echo %max% pause 代码是可以用的,。。如果在10MB的文本中,。执行效率慢的要死,,差不多要半个小时了,.VBS也行,总之能快就行 [ Last edited by dragonamd on 2008-9-12 at 05:10 AM ]

作者: bat-zw     时间: 2008-9-12 11:16
代码的效率问题是出在set _上,修改如下:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
     for %%i in (%%a) do (
          set "var=%%i"
          if "!var:~,2!" equ "5-" (
             if not defined max set "max=!var:~2!" 
             if !var:~2! geq !max! set "max=!var:~2!"   
          )
     )
)
echo %max%&pause>nul

作者: bat-zw     时间: 2008-9-12 11:39    标题: 我晕,上面的没考虑浮点比较,修改如下

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
     for %%b in (%%a) do (
          set "var=%%b"
          if "!var:~,2!" equ "5-" (
             if not defined max set "max=!var:~2!"
             for /f "tokens=1* delims=." %%c in ("!max!") do set "max1=%%c"&set "max2=%%d"
             for /f "tokens=1* delims=." %%e in ("!var:~2!") do (
                 if %%e gtr !max1! (
                    set "max=!var:~2!"
                    ) else (
                    if %%e equ !max1! if %%d gtr !max2! set "max=!var:~2!"
         )
             )
          )
     )
)
echo %max%&pause>nul

作者: huahua0919     时间: 2008-9-12 12:54
借用S11S1代码写个vbs
set fso=createobject("scripting.filesystemobject")
set f=fso.opentextfile("a.txt",1)

while f.atendofstream <> true
  r=r&split(split(f.readline,"5-")(1))(0)&" " '提取所有5-后的数字
wend
r=split(r)                                    '转换为数组
n=ubound(r)                                   '确定数组最大下标
for i=0 to n-1                                '转换数值类型
        r(i)=cdbl(r(i))
next
quicksort r,0,n
msgbox r(n-1)

'快速排序:
'划分:
function partition(r,l,h)
        dim i,j,t
        i=l
        j=h
        t=r(i)'初始化,t为基准
        do 
                while r(j)>=t and i<j
                        j=j-1'从右向左扫描,查找第1个小于t的数
                wend
                if i<j then 
                        r(i)=r(j)'交换r(i)和r(j)
                        i=i+1
                end if
                while r(i)<=t and i<j
                        i=i+1'从左向右扫描,查找第1个大于t的数
                wend
                if i<j then 
                        r(j)=r(i)'交换r(i)和r(j)
                        j=j-1
                end if                
        loop while i<>j
        r(i)=t'基准t已被最后定位
        partition=i
end function
        '排序:
sub quicksort(r,s1,t1)
        dim i
        if s1<t1 then'只有一个数或无数时无须排序
                i=partition(r,s1,t1)'对r(s1)到r(t1)做划分
                quicksort r,s1,i-1'递归处理左区间
                quicksort r,i+1,t1'递归处理右区间
        end if
end sub
[ Last edited by huahua0919 on 2008-9-12 at 01:06 PM ]

作者: dragonamd     时间: 2008-9-12 15:27
代码都测试了,。不会加快 10MB的文本还是一样慢

作者: lxmxn     时间: 2008-9-12 15:58
用 gawk 试试。。。

作者: dragonamd     时间: 2008-9-13 02:37
不会写,

作者: lxmxn     时间: 2008-9-13 12:07
Originally posted by dragonamd at 2008-9-13 02:37: 不会写,
不会写可以自己学习一下嘛。
gawk "{for (i=1;i<=NF;i++) { if($i~/^5-[0-9]/){ split($i,a,/-/); if(a[2]>max) max=a[2]; }}} END{print max}" your_file
[ Last edited by lxmxn on 2008-9-13 at 12:09 PM ]

作者: dragonamd     时间: 2008-9-13 12:17
怎么运行了是没用的,实在不懂

作者: lxmxn     时间: 2008-9-13 12:26
gawk 是一个工具,需要下载,网上搜搜吧。 我这里运行正常。 ps 建议看看置顶的批处理新手FAQ。

作者: dragonamd     时间: 2008-9-14 00:07
不能P处理?

作者: HAT     时间: 2008-9-14 02:18
可以批处理,但是根据你的要求,批处理效率不如gawk高。

作者: dragonamd     时间: 2008-9-14 19:48
不知道那个工具怎么安装,使用

作者: HAT     时间: 2008-9-14 19:50
不用安装,直接下在gawk.exe即可直接在批处理中调用,不会使用可以看帮助。

作者: dragonamd     时间: 2008-9-14 21:23
在网上找了很久下载不到,。能提供下载一下吗?

作者: HAT     时间: 2008-9-14 21:26

作者: dragonamd     时间: 2008-9-14 21:45
和批处理放一起使用不了,。这个还没用过,具体怎么使用,能教一下吗

作者: HAT     时间: 2008-9-14 21:53
还没用过如何知道和批处理放一起使用不了? 先看看帮助吧: gawk --help
Usage: gawk [POSIX or GNU style options] -f progfile [--] file ... Usage: gawk [POSIX or GNU style options] [--] "program" file ... POSIX options: GNU long options: -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val -m[fr] val -W compat --compat -W copyleft --copyleft -W copyright --copyright -W dump-variables[=file] --dump-variables[=file] -W gen-po --gen-po -W help --help -W lint[=fatal] --lint[=fatal] -W lint-old --lint-old -W non-decimal-data --non-decimal-data -W profile[=file] --profile[=file] -W posix --posix -W re-interval --re-interval -W source=program-text --source=program-text -W traditional --traditional -W usage --usage -W version --version To report bugs, see node `Bugs' in `gawk.info', which is section `Reporting Problems and Bugs' in the printed version.

作者: dragonamd     时间: 2008-9-14 22:01
gawk "{for (i=1;i<=NF;i++) { if($i~/^5-[0-9]/){ split($i,a,/-/); if(a[2]>max) max=a[2]; }}} END{print max}" your_file 和gawk放一起使用不正常啊,。

作者: slore     时间: 2008-9-14 23:11
VBS慢因为它排序了,你只要最大的。。。时间复杂度是1

作者: HAT     时间: 2008-9-15 00:27
"不正常"的具体表现是?

作者: dragonamd     时间: 2008-9-15 00:37
谁能解决一下。 表现的错误是 gawk:cmd. line:2:fatal: cannot open file 'your_file for reading <no such file or directory>

作者: lxmxn     时间: 2008-9-15 07:08
gawk:cmd. line:2:fatal: cannot open file 'your_file for reading <no such file or directory>
你有 your_file 这个文件吗? 把 your_file 替换成你自己的数据文件!

作者: dragonamd     时间: 2008-9-15 10:01
根本用不了,。斑竹这代码你可以正常使用 ?

作者: HAT     时间: 2008-9-15 11:18
“根本用不了”的具体表现又是什么?

作者: dragonamd     时间: 2008-9-15 12:48
在这里其他的gawk可以用,就我的不能用

作者: HAT     时间: 2008-9-15 13:00
报错信息贴出来看看?

作者: dragonamd     时间: 2008-9-16 02:00
你们运行正常,我运行不正常,郁闷

作者: HAT     时间: 2008-9-16 10:01
运行不正常,总得有什么现象吧?

作者: dragonamd     时间: 2008-9-16 20:59
表现的错误是 gawk:cmd. line:2:fatal: cannot open file 'your_file for reading <no such file or directory> 还是这样,我不知道你们为什么能正常,

作者: lxmxn     时间: 2008-9-16 21:05
如果你有your_file这个文件,就把这个命令里面your_file前面的单引号去掉。

作者: HAT     时间: 2008-9-16 21:13
gawk "{for (i=1;i<=NF;i++) { if($i~/^5-[0-9]/){ split($i,a,/-/); if(a[2]>max) max=a[2]; }}} END{print max}" "a.txt"

作者: dragonamd     时间: 2008-9-16 21:39
可以用了,能标志一下意思吗 ?好让我自己学着修改,特别是显示的那段 [ Last edited by dragonamd on 2008-9-16 at 09:40 PM ]

作者: HAT     时间: 2008-9-16 21:44
print max “显示的那段”就是这里,打印max的值,标志完毕。 ps.不知斑竹是否有哭笑不得的感觉。

作者: dragonamd     时间: 2008-9-16 21:49
HAT大哥,我是很菜,但我在努力学习,难道就这样笑话新人吗 ?至少在P处理方面学到很多了,不管怎么样都要谢谢你们 print max 这段我换了行就不能显示,。因为我想把标记放到别处去

作者: HAT     时间: 2008-9-16 21:58
这个,我没有笑话任何人的意思,造成了不比要的误会,抱歉。 我的意思是,斑竹已经回答的很清楚了,让你把your_file改成自己的文件名,建议看回过头再看看斑竹的回答。 //print max 这段我换了行就不能显示,。因为我想把标记放到别处去 我很笨,看不懂什么意思,能否把你修改后的代码贴出来看看?

作者: dragonamd     时间: 2008-9-16 22:04
gawk "{for (i=1;i<=NF;i++) { if($i~/^5-[0-9]/){ split($i,a,/-/); if(a[2]>max) max=a[2]; }}} END{print max}" "a.txt" @echo %NewFile% %ste%  %sty% %max% 我想把很多变量放在一起显示 [ Last edited by dragonamd on 2008-9-17 at 12:43 AM ]

作者: dragonamd     时间: 2008-9-17 00:44
帮帮我好吗 ? 对这个实在不懂了,刚才看了网上很教程,都没提到这段

作者: lxmxn     时间: 2008-9-17 07:48
这样试试看
gawk "{for (i=1;i<=NF;i++) { if($i~/^5-[0-9]/){ split($i,a,/-/); if(a[2]>max) max=a[2]; }}} END{print max}" "a.txt" > %temp%\tmp.p
set /p max=<%temp%\tmp.p
echo max 的值为 [%max%].

作者: dragonamd     时间: 2008-9-17 09:28
斑竹的办法是把值写入到临时,再读取对吗?

作者: lxmxn     时间: 2008-9-17 18:42
Originally posted by dragonamd at 2008-9-17 09:28: 斑竹的办法是把值写入到临时,再读取对吗?
嗯,有什么问题吗?

作者: dragonamd     时间: 2008-9-17 20:49
没有问题,昨天晚上我也想过,但不会写,。效率很高,努力学习