本帖最后由 afan 于 2010-1-18 01:33 编辑
哈哈,一直等楼主的解,终于看到了,呵呵
不过可能我太钻牛角尖了,对条件的理解有些多了“4、段落与段落 ...
llztt 发表于 2010-1-17 17:31
我觉得很有道理~~ 这样的话貌似必须使用一个匹配字符串的函数,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[0]
For $i = $sS[0] 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[0]
$strNew &= ':' & $sS[$x] & @CRLF & @CRLF
Next
MsgBox(0, '完成耗时(s):' & TimerDiff($ts) / 1000, $strNew)
|