xrbenbeba
发表于 2010-1-17 18:24:11
先回个帖子 看看大伙都怎么弄的
rolaka
发表于 2010-1-17 18:26:42
本帖最后由 rolaka 于 2010-1-17 21:11 编辑
$begin = TimerInit()
;拆解文件
Local $file = StringRegExp(FileRead("a.txt"), "(?<=:)[^:]*", 3)
;排序
Local $out
For $n = 0 To UBound($file)-1
For $i = UBound($file)-1 To 1 Step -1
If $file[$i] < $file[$i - 1] Then
$temp = $file[$i]
$file[$i] = $file[$i - 1]
$file[$i - 1] = $temp
EndIf
Next
$out &= ":" & $file[$n]
Next
MsgBox(0, "", TimerDiff($begin))
MsgBox(0, "", $out)
好像迟到了- -!
借用了afan的思想。。合成并入主循环
不过 一旦内容里出现: 也会断开...解决办法是 预先替换非行首: 最后合成的时候一口气转换...
修正了排序算法的问题....33楼眼尖-___-+
llztt
发表于 2010-1-17 20:36:53
回复 32# rolaka
排序方法是错误的,不信你多添几个段落就知道了,譬如在中间加一个:aaa段落和:zzzz段落。。。
rolaka
发表于 2010-1-17 21:03:22
本帖最后由 rolaka 于 2010-1-17 21:05 编辑
回复rolaka
排序方法是错误的,不信你多添几个段落就知道了,譬如在中间加一个:aaa段落和:zzzz ...
llztt 发表于 2010-1-17 20:36 http://www.autoitx.com/images/common/back.gif
是的...大文件测试的时候就发现了 冒泡里面内层反了...想连带不用正则版本一起更新- -
afan
发表于 2010-1-17 21:19:38
本帖最后由 afan 于 2010-1-18 01:33 编辑
哈哈,一直等楼主的解,终于看到了,呵呵
不过可能我太钻牛角尖了,对条件的理解有些多了“4、段落与段落 ...
llztt 发表于 2010-1-17 17:31 http://www.autoitx.com/images/common/back.gif
我觉得很有道理~~ 这样的话貌似必须使用一个匹配字符串的函数,StringRegExp、StringSplit之类的。
综合几点考虑:
1,段落内可能会有其它的空行,重排后要保留这些段落内的空行;
2,段落内可能会有其它的非行头的“:”字符;
3,txt文档字符串头部可能有空行、尾部可能没有回车符
重新修改了下~ 为了不使用UBound函数,只好使用StringSplit了,不算拓展类了,呵呵~
其他人的代码还没细看,有时间再学习,再修改 ~~||
Dim $ts = TimerInit(), $strNew, $i, $x, $atmp
Dim $str = FileRead('a.txt')
Dim $sS = StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
For $x = 2 To $sS
For $i = $sS To 2 Step -1
If $sS[$i] < $sS[$i - 1] Then
$atmp = $sS[$i]
$sS[$i] = $sS[$i - 1]
$sS[$i - 1] = $atmp
EndIf
Next
$strNew &= ':' & $sS[$x] & @CRLF & @CRLF
Next
MsgBox(0, '完成耗时(s):' & TimerDiff($ts) / 1000, $strNew)
以上代码对付小文件还行,对于几千几万行的文件,实战操作的话我还是选择使用其它函数,比如_ArraySort,效率高很多倍,代码也简洁些
#include <Array.au3>
Dim $ts = TimerInit(), $strNew, $x
Dim $str = FileRead('a.txt')
Dim $sS = StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
_ArraySort($sS, 0, 2)
For $x = 2 To $sS
$strNew &= ':' & $sS[$x] & @CRLF & @CRLF
Next
MsgBox(0, '完成耗时(s):' & TimerDiff($ts) / 1000, $strNew)
rolaka
发表于 2010-1-17 21:52:43
我觉得很有道理~~ 这样的话貌似必须使用一个匹配字符串的函数,StringRegExp、StringSplit之类的 ...
afan 发表于 2010-1-17 21:19 http://www.autoitx.com/images/common/back.gif
ubound可以用StringRegExpReplace执行成功后的@Extended代替...+ +
llztt
发表于 2010-1-17 22:04:29
本帖最后由 llztt 于 2010-1-17 22:06 编辑
回复 35# afan
StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
字符串前加@CRLF & @CRLF&这个处理办法很好啊,呵呵,简洁多了
排序方式是有问题的,你文件的段落中间多加几个段落,譬如用:A和:Z开头的,再看看结果
PS:UBOUND算是扩展类函数??AU3的函数是怎么分类的啊,我还真不太清楚,望赐教哈
rolaka
发表于 2010-1-17 22:14:01
本帖最后由 rolaka 于 2010-1-17 22:17 编辑
$begin = TimerInit()
;读取文件
Local $file_ = FileRead("a.txt")
;拆解文件
Local $file = StringRegExp($file_, "(?<=:)[^:]*", 3)
;计算数组大小
StringRegExpReplace(@CRLF & $file_, "\n:", "")
;排序
Local $out
For $n = 0 To @Extended-1
For $i = @Extended-1 To 1 Step -1
If $file[$i] < $file[$i - 1] Then
$temp = $file[$i]
$file[$i] = $file[$i - 1]
$file[$i - 1] = $temp
EndIf
Next
$out &= ":" & $file[$n]
Next
MsgBox(0, "", TimerDiff($begin))
MsgBox(0, "", $out)
再折腾一个- -+ UB都不用...在下去我只能StringRegExp把字符一个个文件用循环一个个来拼了- -
已经完全陷进偏门了 20kb的文件跑了4秒
rolaka
发表于 2010-1-17 22:18:09
回复afan
StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
字符串前加@CRLF & @CRLF&这 ...
llztt 发表于 2010-1-17 22:04 http://www.autoitx.com/images/common/back.gif
UB不用。。。数组大小就没办法取了 应该可以不算把 split内不算的话
llztt
发表于 2010-1-17 22:37:32
回复 38# rolaka
请教正则里的(?<=:),是什么意思哈?
rolaka
发表于 2010-1-17 22:43:07
本帖最后由 rolaka 于 2010-1-17 22:44 编辑
回复rolaka
请教正则里的(?
llztt 发表于 2010-1-17 22:37 http://www.autoitx.com/images/common/back.gif
俄 零宽断言
...就是预先要满足这个exp 在他的之后再进行剩余的匹配 算是匹配的准备条件- -
好处就是 他不会被匹配到结果里
llztt
发表于 2010-1-17 22:55:19
我记的正则里没有<>号啊,圆括号里的?:?=?!都可以理解,但?<=确实没见过呢,呵呵
rolaka
发表于 2010-1-17 22:58:08
http://deerchao.net/tutorials/regex/regex.htm
我看这个的时候发现的 满简单的... 也蛮好使
afan
发表于 2010-1-18 01:07:36
回复afan
StringSplit(@CRLF & @CRLF & $str, @CRLF & @CRLF & ':', 1)
字符串前加@CRLF & @CRLF&这 ...
llztt 发表于 2010-1-17 22:04 http://www.autoitx.com/images/common/back.gif
谢谢指正,没来得及细想,照 rolaka 的思路已修正~
lchl0588
发表于 2010-1-18 18:27:15
#3
呵呵,唯一没有想到的是“ArraySort”这个函数,其它倒试过!!!
呵呵,完全可以依“:a到:z”的顺序判断,属于完美之作----------哈哈