大量のログファイルやテキストデータの中から、特定の行だけを抽出したいというケースは少なくありません。とくに、ファイルが大きすぎてすべて読み込むとパフォーマンスに影響する場合には、行番号を指定して必要な部分だけを読み込む方法が効果的です。
本記事では、Excel VBAと ADODB.Stream
を活用し、EUC-JPでエンコードされたテキストファイルから、任意の行位置から特定行数だけ読み込む方法をご紹介いたします。
目次
シナリオの想定
- 読み込むファイルは
systemlog_euc.txt
(EUC-JP形式で保存) - 10行目から3行分だけ読み取り、Excelシートに表示
- ファイル全体を読み込まず、必要部分だけ効率的に取り出す
VBAコード:指定行から指定行数だけ読み込む
Sub ReadPartialTextLines()
Dim startLine As Long: startLine = 10
Dim numberOfLines As Long: numberOfLines = 3
Dim currentLine As Long
Dim stream As Object
Dim i As Long
Set stream = CreateObject("ADODB.Stream")
With stream
.Charset = "EUC-JP"
.Type = 2 ' テキストモード
.LineSeparator = 10 ' 改行コード LF
.Open
.LoadFromFile ThisWorkbook.Path & "\systemlog_euc.txt"
' 読み飛ばし
For currentLine = 1 To startLine - 1
If .EOS Then Exit For
.SkipLine
Next
' 指定行数だけ読み取り
For i = 1 To numberOfLines
If .EOS Then Exit For
ThisWorkbook.Worksheets(1).Cells(i, 1).Value = .ReadText(-2)
Next
.Close
End With
End Sub
解説
処理内容 | 説明 |
---|---|
Charset = "EUC-JP" | EUC-JP形式の文字エンコーディングに対応 |
LineSeparator = 10 | 改行コードをLF(UNIX系)に設定 |
.SkipLine | 指定行まで読み飛ばす処理 |
.ReadText(-2) | 1行ずつ読み込む(-2 は1行単位を意味) |
.EOS | ファイルの終端判定(End Of Stream) |
実行結果(イメージ)
A列に出力される内容 |
---|
ログメッセージ10行目 |
ログメッセージ11行目 |
ログメッセージ12行目 |
注意点
- ファイルが存在しない場合はエラーとなるため、事前にファイルパスや存在チェックを加えると安全です。
LineSeparator
を-1
に設定すれば、CRLFにも対応可能です(Windows形式の改行)。- EUC-JP以外の文字コードにしたい場合は、
UTF-8
やShift-JIS
に変更可能です。
応用ポイント
- 行の内容に応じてフィルタ処理や条件分岐を加えることも可能です。
- 1行をカンマやタブで分割し、複数列に展開する処理を追加することでCSVにも応用できます。
まとめ
Excel VBAで ADODB.Stream
を使えば、巨大なテキストファイルの中から必要な行だけをピンポイントで抽出することができます。
業務ログ、データレポート、連携ファイルなどを対象に、効率よく読み込む仕組みを構築する際にぜひお役立てください。