0

VB6 を使用して、文中に ERROR キーワードを含むテキスト ファイルから行を抽出する方法。私はVB6に非常に慣れていないので、ログファイルから複数の行を抽出してログファイルの最後に入れたいと思っています。

ログファイル:Log.txt

2012-10-29 22:39:47 ---------------------------------------- --

2012-10-29 22:39:47 アプリケーションを開始しています...

2012-10-29 22:39:47 フラグ ファイルを削除しています...

2012-10-29 22:39:47 ユーザー「管理者」として正常に認証されました

2012-10-29 22:40:11 ロール選択ダイアログボックスを表示しています...

2012-10-29 22:40:13 役割が選択されました: テストロール

2012-10-29 22:40:16 インストール状況を確認しています...

2012-10-29 22:41:21 BO サーバーに正常に接続されました

2012-10-29 22:41:21 プロセスが完了しました

2012-10-30 20:19:35 -------------------------------------------- --

2012-10-30 20:19:35 アプリケーションを開始しています...

2012-10-30 20:19:35 フラグ ファイルを削除しています...

2012-10-29 22:40:11 サーバーへの接続エラー

2012-10-29 22:40:16 インストール状況を確認しています...

2012-10-29 22:41:21 関数 ShellAndWait でエラーが発生しました。エラーコード: 0

2012-10-29 22:41:21 エラー: 2012-10-29 22:41:21 エラー: オブジェクト '~' のメソッド '~' が失敗しました

2012-10-29 22:41:21 ローカル ソース フォルダーを検索しています...

2012-10-29 22:41:21 エラー: オブジェクト '~' のメソッド '~' が失敗しました

2012-10-29 22:41:21 フォルダー \xxx.xxx.x.xx\xyz\Script を E:\ にコピーしています

2012-10-29 22:41:21 非重大エラー: フォルダ \xxx.xxx.x.xx\admin メソッドのコピー中にエラーが発生しました

2012-10-29 22:41:21 プロセスが完了しました

上記のログ ファイルで、現在のセッションのセネテンスに Error キーワードを含む行を抽出し、それらすべての行を収集して現在のログの最後に配置したいと考えています。たとえば、上記のログ ファイルでは、現在のログはこのセッションのこの行から開始されます

"2012-10-30 20:19:35 --------------------------------------- ---」

そして行で終わる

"2012-10-29 22:41:21 プロセスが完了しました"

したがって、これら2行の間にエラーキーワードを含む行を抽出し、この「2012-10-29 22:41:21 The process completed」行の下に配置したい

「2012-10-29 22:41:21 処理が完了しました」

セッション 2012-10-29 22:40:11 で発生したエラーを以下に示します

2012-10-29 22:40:11 サーバーへの接続エラー

2012-10-29 22:41:21 関数 ShellAndWait でエラーが発生しました。エラーコード: 0

2012-10-29 22:41:21 エラー:

2012-10-29 22:41:21 エラー: オブジェクト '~' のメソッド '~' が失敗しました

2012-10-29 22:41:21 エラー: オブジェクト '~' のメソッド '~' が失敗しました

012-10-29 22:41:21 非重大エラー: フォルダー \xxx.xxx.x.xx\admin のコピー中にエラーが発生しました オブジェクト '~' のメソッド '~'

VB6で可能ですか?私を案内してください、そして前もって感謝します。

4

2 に答える 2

3

普通の古いネイティブ VB6 I/O は、このような場合にうまく機能します。80MB のテスト ログ パフォーマンスに対するテストでも許容範囲でした。おまけ: この方法で大量の RAM を消費することはありません。

おまけとして、この試みは (a.) あなたが要求したことを実行すると思います。(b.) 大文字と小文字を区別しない検索を行い、(c.) シーケンス内で「エラー」が発生したときに誤ったヒットを取得しません。より長い単語 (例: "terror")。

また、「エラー」のないセッションには「 none 」行を追加しますが、必要に応じてそれを変更または削除できます。

Option Explicit

Private fOrigLog As Integer
Private fNewLog As Integer
Private colErrorLines As Collection
Private strSessionTimestamp As String

Private Sub FlushErrorLines()
    Print #fNewLog, "Errors encountered in session "; _
                    strSessionTimestamp; _
                    " are listed below"
    With colErrorLines
        If .Count = 0 Then
            Print #fNewLog, "*none*"
        Else
            Do While .Count > 0
                Print #fNewLog, .Item(1)
                .Remove 1
            Loop
        End If
    End With
End Sub

Private Sub Main()
    Const DASHES As String = "------------------------------------------"
    Dim strLine As String
    Dim strLineUCased As String
    Dim posError As Long

    fOrigLog = FreeFile(0)
    Open "log.txt" For Input As #fOrigLog Len = 32767

    fNewLog = FreeFile(0)
    Open "newlog.txt" For Output As #fNewLog Len = 32767

    Set colErrorLines = New Collection

    Do Until EOF(fOrigLog)
        Line Input #fOrigLog, strLine
        If Mid$(strLine, 21, 42) = DASHES Then
            If Len(strSessionTimestamp) > 0 Then
                FlushErrorLines
            End If
            strSessionTimestamp = Left$(strLine, 19)
            Print #fNewLog, strLine
        Else
            strLineUCased = UCase$(strLine)
            posError = InStr(21, strLineUCased, "ERROR")
            If posError > 0 Then
                'Make sure we have a whole word "ERROR" here:
                If Mid$(strLineUCased, posError - 1, 7) & " " _
                        Like "[!0-9A-Z]ERROR[!0-9A-Z]*" Then
                    colErrorLines.Add strLine
                Else
                    Print #fNewLog, strLine
                End If
            Else
                Print #fNewLog, strLine
            End If
        End If
    Loop
    Close #fOrigLog
    FlushErrorLines
    Close #fNewLog

    MsgBox "Complete"
End Sub
于 2013-06-14T22:29:18.507 に答える
1

いくつかの簡単なサンプル コード:

Private Sub Command1_Click()
  Dim lngLine As Long
  Dim strFile As String
  Dim intFile As Integer
  Dim strData As String
  Dim strLine() As String
  Dim strErrors As String
  'set filename
  strFile = "c:\temp\test.log"
  intFile = FreeFile
  'openj file
  Open strFile For Input As #intFile
    'read data from file
    strData = Input(LOF(intFile), #intFile)
  Close #intFile
  'split data into an array of lines
  strLine = Split(strData, vbCrLf)
  'empty error list
  strErrors = ""
  'loop through all lines of data
  For lngLine = 0 To UBound(strLine)
    If InStr(strLine(lngLine), "Error") > 0 Then
      'add line to errors if it contains the word "Error"
      strErrors = strErrors & strLine(lngLine) & vbCrLf
    End If
  Next lngLine
  'show the errors
  Print strErrors
End Sub
于 2013-06-13T13:35:40.133 に答える