找回密码
 加入
搜索
查看: 17663|回复: 31

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

 火... [复制链接]
发表于 2012-1-12 20:40:04 | 显示全部楼层 |阅读模式
本帖最后由 jasonyan97 于 2012-1-12 21:15 编辑

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

想获得内容222222在这个文本的第几行?
发表于 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[0]
    If $aRecords[$line] == "222222" Then
          $isFound = 1
          ExitLoop
    EndIf
Next
If $isFound Then
    Msgbox(0, '', 'Found. Line ' & $line)
Else
    Msgbox(48, '', 'Not found!')
EndIf

评分

参与人数 1金钱 +10 收起 理由
jasonyan97 + 10 谢谢帮忙!

查看全部评分

 楼主| 发表于 2012-1-12 21:15:24 | 显示全部楼层
谢谢了#2,解决了!!
发表于 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

评分

参与人数 3金钱 +70 贡献 +7 收起 理由
binghc + 30 不错!
xiehuahere + 30 + 5 服了,@Extended还有这种用法!
gzh888666 + 10 + 2 这个真的比较棒!

查看全部评分

 楼主| 发表于 2012-1-12 21:41:12 | 显示全部楼层
但如果换成不是数字就不行了吗?
比如文本是:
111111
d:\2222
333333
444444

要确定d:\在文本的第几行?这样又该如何写呢?
 楼主| 发表于 2012-1-12 22:05:51 | 显示全部楼层
afan版主,再帮我看看吧?#2换成不是数字就不行了,
比如文本内容是:
111111
d:\2222
333333
444444

要确定d:\在文本的第几行?又或者d:\可能在文本的任意位置,又可能出现在第三行中间,又可能出现在第四行尾部,这样又该如何来获取第几行呢?
发表于 2012-1-12 22:06:57 | 显示全部楼层
回复 4# afan


    前段时间,论坛里不是有位哥们做过这样的实验,
最后的结论是StringReplace处理效率比StringRegExpReplace要快一些,
所以这里StringRegExpReplace($str1, @CRLF, '')
换成StringReplace可能更好点儿
发表于 2012-1-12 22:08:56 | 显示全部楼层
回复 7# binghc


    这里我开始就是用的StringReplace,后来发现比StringRegExpReplace慢~
 楼主| 发表于 2012-1-12 22:12:34 | 显示全部楼层
回复 8# afan

afan版主,再帮我看看6#的问题吧,我不想再发新帖求助,但问题没能解决呀。
发表于 2012-1-12 22:15:30 | 显示全部楼层
回复 9# jasonyan97


    第9行改为 If StringInStr($aRecords[$line], "222222") Then
发表于 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快!你再试试?!
 楼主| 发表于 2012-1-12 22:24:24 | 显示全部楼层
回复 10# afan
恩。。谢谢AFAN,完美解决!
发表于 2012-1-12 22:28:07 | 显示全部楼层
回复 11# binghc


    你用个稍大的文件试试,这个只有几字节,看不出结果~
发表于 2012-1-12 22:31:40 | 显示全部楼层
其实楼主这问题可以扩展一下,可以写个udf,在一个大文本中,在那些行有指定的子字符串
发表于 2012-1-12 22:34:57 | 显示全部楼层
回复 13# afan


    是你说过再小也能看出来的,小文件也确实能看出效率差别,要不你上传个大点儿的文件,再贴上要找的内容
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 21:10 , Processed in 0.095824 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表