VBAによるテキストファイルの処理についての質問です。


特定のフォルダ内にある全てのテキストファイルにおいて、特定のキーワードから
始まる複数行のデータを抽出するマクロをご教示ください。

例)
2015/3/10 23:30:05

==== DATA =====
--- DATA1 ---- ----DATA2---- ----DATA3---- ----DATA4----
2015/1/1 00:00 0.00 100 200 300 0.0 0% 0%
2015/1/1 00:10 0.00 100 200 300 0.0 0% 0%

2015/1/1 23:50 0.00 100 200 300 0.0 0% 0%

==== DATA2 ====



上記データが含まれるテキストファイル(改行LF)が複数あり、全てのテキスト
ファイルから==== DATA ===== から ==== DATA2 ===== までの間のデータ
だけを抽出し、1つのファイルに保存するマクロを作りたいのですが、
作り方をご教示ください。

キーワードからキーワードまででも良いですし、キーワードから決まった行数分
データを抽出するでもかまいません。

元ファイルがLF改行なので、その点も考慮頂きヒントを頂けますと幸いです。


以上、宜しくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2015/03/14 11:09:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント500pt

こんな感じになると思います。

Sub extract_textdata()

    Open "D:\tmp\input.txt" For Input As #1
        Line Input #1, buf
    Close #1
    
    buf2 = Split(buf, vbLf)
    found = False

    Dim data() As String
    n = 0
    For Each Line In buf2
        If Line = "==== DATA2 ====" Then    ' 終了判定
            Exit For
        End If
        If found Then
            ReDim Preserve data(n)
            data(n) = Line
            n = n + 1
        End If
        If Line = "==== DATA =====" Then    ' 開始判定
            found = True
        End If
    Next

    Open "D:\tmp\output.txt" For Output As #1
    For Each Line In data
        Print #1, Line
    Next
    Close #1

End Sub

入力のデータを一気に読み込んでから Split 関数で分割しているので、元データが大きいと動かない可能性はあります。
とりあえず、1、2 万行くらいのデータであれば処理できるみたいですけれど。




追記です。

全てのテキストファイル、というのを、すっかり失念してました ><。
こんな感じになります。

Sub extract_textdata()

    Const targetFolder = "D:\tmp"               ' 対象のテキストファイル群があるフォルダ名
    Const outputFile = "D:\output\output.txt"   ' 出力ファイル名
    
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set folder = fs.GetFolder(targetFolder)

    Open outputFile For Output As #2

    For Each f In folder.Files
        fname = folder.Path & "\" & f.Name
        Open fname For Input As #1
            Line Input #1, buf
        Close #1
        
        buf2 = Split(buf, vbLf)
        found = False

        Dim data() As String
        n = 0
        For Each Line In buf2
            If Line = "==== DATA2 ====" Then
                Exit For
            End If
            If found Then
                ReDim Preserve data(n)
                data(n) = Line
                n = n + 1
            End If
            If Line = "==== DATA =====" Then
                found = True
            End If
        Next

        For Each Line In data
            Print #2, Line
        Next

    Next

    Close #2

    Set fs = Nothing

End Sub

後、追加の質問で恐縮ですが、指定したキーワードから上下で何行まで
とかを指定することは可能でしょうか?
もしくは、開始キーワードからの行数指定での抽出方法があれば
ご教示下さい。

「上下」ってのは、ちょっと面倒なのですが、開始キーワードから行数指定であれば簡単です。
内側のループの脱出条件を、以下のように書き換えます。

        For Each Line In buf2
'           If Line = "==== DATA2 ====" Then
'               Exit For
'           End If
            If n = 2 Then       ' 開始キーワードから 2行だけ出力する
                Exit For
            End If
id:buri0624

上下指定が出来ればベストですが、別で質問させて頂いた不要な行の削除
処理とあわせれば何とかできそうです。

素早い回答本当に助かります。どうも有難うございました。

2015/03/14 11:09:07
  • id:buri0624
    情報有難うございます。

    複数ファイルの読み込み処理をクリアできれば使えそうです。
    上記マクロに、条件としていた"特定のフォルダ内にある全てのテキスト
    ファイル"を読み込んで処理が出来ればイメージに近いことが出来そうです。

    後、追加の質問で恐縮ですが、指定したキーワードから上下で何行まで
    とかを指定することは可能でしょうか?
    もしくは、開始キーワードからの行数指定での抽出方法があれば
    ご教示下さい。宜しくお願いします。
  • id:a-kuma3
    すみません、全てのテキストファイルから、というのをすっかり失念してました ><。

    対象フォルダの全ファイルを対象にしたマクロを、回答に追記しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません