lai 发表于 2021-10-19 14:36:58

[已解决]在txt文件中, 搜索多字符串并复制字符串的下一行字串, 依序印出

本帖最后由 lai 于 2021-10-19 15:36 编辑

各位前輩, 找了很多字符串的帖子但沒有找到適合的, 有看到一個相關的方法但只能找一次, 以下是網路上找到的,

針對txt內的字串找到$search後複製下一行, 字符串HP 可以抓到      100這數值, 想請問如果我要搜尋一個文件但多個字串並抓取每字串的下一行呢?

#include <File.au3>
#include <Array.au3>


Global $file = @ScriptDir & "\test.txt", $search = "HP"
Global $iLine = 0, $sLine = '', $iValid = 0
Global $hFile = FileOpen($file)
If $hFile = -1 Then
    MsgBox(0,'ERROR','Unable to open file for reading.')
    Exit 1
EndIf

; find the line that has the search string
While 1
    $iLine += 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop

    ; test the line for the $search string until the flag $iValid is set
    If StringInStr($sLine, $search) And Not $iValid Then
      $iValid = 1
      ContinueLoop
    EndIf

    If $iValid Then
      $iValid += 1
      ConsoleWrite($iLine & ':' & $sLine & @CRLF)
      If $iValid > 1 Then ExitLoop
    EndIf
WEnd
FileClose($hFile)
test.txtHP
      100
MP
      100
Attack
      255
Speed
      255


afan 发表于 2021-10-19 15:32:13

lai 发表于 2021-10-19 15:24
另外請問
我嘗試加上其他非數字字串得出結果卻不是我預期

你在一楼以及示例都是“数值”,现在的显然不是,当然不会捕获。所以,示例要尽量全面
#include <Array.au3>

Local $sFileRead = FileRead(@ScriptDir & '\test.txt')
Local $sKeys = 'test|Speed'      ;需搜索的多个关键字,以|分隔
Local $aRE = StringRegExp($sFileRead, '(?mi)^\h*(' & $sKeys & ')\h*\v+\h*(\V+)', 3)
_ArrayDisplay($aRE)

afan 发表于 2021-10-19 15:04:35

憋了九年冒了第一个泡 O o 。.
#include <Array.au3>

Local $sFileRead = FileRead(@ScriptDir & '\test.txt')
Local $sKeys = 'HP|Speed'        ;需搜索的多个关键字,以|分隔
Local $aRE = StringRegExp($sFileRead, '(?mi)^\h*(' & $sKeys & ')\h*\v+\h*(\d+)', 3)
_ArrayDisplay($aRE)

lai 发表于 2021-10-19 15:11:42

本帖最后由 lai 于 2021-10-19 15:24 编辑

Haha, 版主,
因為搜索了九年 只能當聽眾, 無法上台表演:face (37):

lai 发表于 2021-10-19 15:24:25

afan 发表于 2021-10-19 15:04
憋了九年冒了第一个泡 O o 。.

另外請問
我嘗試加上其他非數字字串得出結果卻不是我預期


lai 发表于 2021-10-19 15:36:12

本帖最后由 lai 于 2021-10-19 15:44 编辑

受教了, 完美詮釋還需要去深入看完StringRegExp後的參數:face (12):

sh1536 发表于 2021-10-19 15:54:23

正则菜鸡附上我的方法,不知道是否对楼主有用
#include <File.au3>
#include <Array.au3>

Global $file = @ScriptDir & "\test.txt", $search = "HP|Attack"
Global $hFile = FileOpen($file)
If $hFile = -1 Then
    MsgBox(0,'ERROR','Unable to open file for reading.')
    Exit 1
EndIf

$a = search($search)
MsgBox(0, "", @error ? "查询错误代码:" & @error : $a)
_Exit()


Func search($iSearch)
        If $iSearch = "" Then Return SetError(1)
        Local $SearchArr = StringSplit($iSearch, "|", 2)
        Local $iLine = 1, $sLine = '', $sLine_1 = ''
        Local $Return = ''
        While 1
                $sLine = FileReadLine($hFile, $iLine)
                If @error = -1 Then ExitLoop
                $sLine_1 = FileReadLine($hFile, $iLine + 1)

                _ArraySearch($SearchArr, $sLine)
                If @error = 0 Then
                        $Return &= $iLine & '-' & $sLine & ":" & $sLine_1 & @CRLF
                EndIf
                $iLine += 2
        WEnd
        If $Return = "" Then Return SetError(2)
        $Return = StringStripWS($Return, 2)
        Return SetError(0, "", $Return)
EndFunc

Func _Exit()
        FileClose($hFile)
        Exit 0
EndFunc

lai 发表于 2021-10-19 16:02:11

wow,
感謝sh1536, 測試也可行還有細節, 依樣感謝兩位大神afan, sh1536

chzj589 发表于 2021-10-20 20:47:01

又学了一招,读取TXT数组显示于GUICtrlCreateEdit控件,速度更快。

qop1831 发表于 2021-10-21 04:59:16

afan 发表于 2021-10-19 15:04
憋了九年冒了第一个泡 O o 。.

膜拜大佬   好久不见:face (26):

afan 发表于 2021-10-21 10:13:39

qop1831 发表于 2021-10-21 04:59
膜拜大佬   好久不见

我说的是楼主冒第一个泡,九年来第一帖 _ _||
我本人是分分钟见 ^ ^

lai 发表于 2021-10-22 16:15:51

:face (27):
這事情要回到九年前...細說了

qop1831 发表于 2021-10-23 10:43:11

afan 发表于 2021-10-21 10:13
我说的是楼主冒第一个泡,九年来第一帖 _ _||
我本人是分分钟见 ^ ^

好吧   看来是我太久没来逛了:face (24):
页: [1]
查看完整版本: [已解决]在txt文件中, 搜索多字符串并复制字符串的下一行字串, 依序印出