jasonyan97 发表于 2012-1-12 20:40:04

[已解决]怎么获取匹配字符串在文本的行数?

本帖最后由 jasonyan97 于 2012-1-12 21:15 编辑

有一个文本,内容为:
111111
222222
333333
444444
555555
666666

想获得内容222222在这个文本的第几行?

xiehuahere 发表于 2012-1-12 21:09:17

本帖最后由 xiehuahere 于 2012-1-12 21:10 编辑

#include <file.au3>
Dim $aRecords, $line
Dim $isFound = 0
If Not _FileReadToArray("test.txt", $aRecords) Then
   MsgBox(4096, "Error", " Error reading log to Array. Error Number: " & @error)
   Exit
EndIf
For $line = 1 to $aRecords
    If $aRecords[$line] == "222222" Then
          $isFound = 1
          ExitLoop
    EndIf
Next
If $isFound Then
    Msgbox(0, '', 'Found. Line ' & $line)
Else
    Msgbox(48, '', 'Not found!')
EndIf

jasonyan97 发表于 2012-1-12 21:15:24

谢谢了#2,解决了!!{:face (427):}

afan 发表于 2012-1-12 21:29:22

Func _FileLineFindKey($sFileName, $sKey)
        Local $str = FileRead($sFileName)
        Local $iStart = StringInStr($str, $sKey)
        If @error Then Return SetError(1)
        Local $str1 = StringMid($str, 1, $iStart)
        StringRegExpReplace($str1, @CRLF, '')
        Return @extended + 1
EndFunc   ;==>_FileLineFindKey

jasonyan97 发表于 2012-1-12 21:41:12

但如果换成不是数字就不行了吗?
比如文本是:
111111
d:\2222
333333
444444

要确定d:\在文本的第几行?这样又该如何写呢?

jasonyan97 发表于 2012-1-12 22:05:51

afan版主,再帮我看看吧?#2换成不是数字就不行了,
比如文本内容是:
111111
d:\2222
333333
444444

要确定d:\在文本的第几行?又或者d:\可能在文本的任意位置,又可能出现在第三行中间,又可能出现在第四行尾部,这样又该如何来获取第几行呢?

binghc 发表于 2012-1-12 22:06:57

回复 4# afan


    前段时间,论坛里不是有位哥们做过这样的实验,
最后的结论是StringReplace处理效率比StringRegExpReplace要快一些,
所以这里StringRegExpReplace($str1, @CRLF, '')
换成StringReplace可能更好点儿{:face (280):}

afan 发表于 2012-1-12 22:08:56

回复 7# binghc


    这里我开始就是用的StringReplace,后来发现比StringRegExpReplace慢~

jasonyan97 发表于 2012-1-12 22:12:34

回复 8# afan

afan版主,再帮我看看6#的问题吧,我不想再发新帖求助,但问题没能解决呀。

afan 发表于 2012-1-12 22:15:30

回复 9# jasonyan97


    第9行改为 If StringInStr($aRecords[$line], "222222") Then

binghc 发表于 2012-1-12 22:20:01

回复 8# afan


Func _FileLineFindKey($str, $sKey)
      Local $iStart = StringInStr($str, $sKey)
      If @error Then Return SetError(1)
      Local $str1 = StringMid($str, 1, $iStart)
                Local $time=TimerInit()
;~                 StringRegExpReplace($str1, @CRLF, '')
                StringReplace($str1, @CRLF, '')
                $time=TimerDiff($time)
                ConsoleWrite($time&@LF)
      Return @extended + 1
EndFunc   ;==>_FileLineFindKey

$str='111111'&@CRLF& _
'222222'&@CRLF& _
'333333'&@CRLF& _
'444444'&@CRLF& _
'555555'&@CRLF& _
'666666'

ConsoleWrite(_FileLineFindKey($str, '222222')&@LF)

我反复测试,StringReplace都要比StringRegExpReplace快!你再试试?!{:face (280):}

jasonyan97 发表于 2012-1-12 22:24:24

回复 10# afan
恩。。谢谢AFAN,完美解决!

afan 发表于 2012-1-12 22:28:07

回复 11# binghc


    你用个稍大的文件试试,这个只有几字节,看不出结果~

binghc 发表于 2012-1-12 22:31:40

其实楼主这问题可以扩展一下,可以写个udf,在一个大文本中,在那些行有指定的子字符串{:face (280):}

binghc 发表于 2012-1-12 22:34:57

回复 13# afan


    是你说过再小也能看出来的{:face (356):},小文件也确实能看出效率差别,要不你上传个大点儿的文件,再贴上要找的内容
页: [1] 2 3
查看完整版本: [已解决]怎么获取匹配字符串在文本的行数?