VBScriptを掌握せよ:FSO `TextStream` で「闇のバグ」を駆逐する解析術
業務自動化の現場において、VBScriptは「枯れた技術」として侮られがちだ。だが、大規模なログ解析やCSV処理を行う際、メモリを食い潰す高機能言語よりも、OSの深淵に直結したFSO(File System Object)の挙動を理解している方が、圧倒的に堅牢なツールを構築できる。
今回は、初心者が陥りやすい「読み込みエラーの追跡不能」という呪縛を断ち切るために、`TextStream` オブジェクトの `Line` および `Column` プロパティを極限まで活用する設計論を説く。
—
なぜ「エラー位置の特定」が重要なのか
多くの初心者は、ファイルを読み込む際に「行単位のループ」だけを実装し、例外が発生した際に「どこで落ちたか分からない」という地獄を見る。
数万行のデータファイルにおいて、エラー発生箇所を特定できなければ、デバッグは「運頼み」になる。我々プロフェッショナルは、「エラーが起きた瞬間に、その座標(行番号・列番号)を確定させる」ことを設計の前提とする。
`TextStream` の隠れた能力
- `Line` プロパティ: 現在の読み込み行番号を保持する。
- `Column` プロパティ: 現在の行内での文字位置(カーソル位置)を保持する。
これらを組み合わせれば、パースエラーの瞬間に「何行目の、どの文字位置で構文が崩れたか」をログに叩き出せる。
—
堅牢なテキスト解析・設計パターン
プロダクション環境で利用可能な、保守性の高いテンプレートを提示する。ポイントは「エラーハンドリングを解析ロジックと分離すること」だ。
‘ エラーが発生した際、正確な位置を特定する構造化パース処理
Option Explicit
Sub ParseDataFile(strFilePath)
Dim objFSO, objFile, strLine
Dim nLine, nColumn
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ ファイルが存在しない、あるいはロックされている場合を想定したガード節
If Not objFSO.FileExists(strFilePath) Then
WScript.Echo “致命的エラー: ファイルが存在しません – ” & strFilePath
Exit Sub
End If
Set objFile = objFSO.OpenTextFile(strFilePath, 1) ‘ 1 = ForReading
On Error Resume Next ‘ ここからパース開始
Do Until objFile.AtEndOfStream
‘ 現在のポインタを記録
nLine = objFile.Line
strLine = objFile.ReadLine
‘ 疑似パース処理: ここで例外が発生する想定
‘ 例: データの桁数が合わない、数値変換できない等
If Not ValidateLine(strLine) Then
‘ 明示的なエラー生成(もしくはバリデーション失敗時の例外)
Err.Raise 9999, “Parser”, “データ形式不正”
End If
If Err.Number <> 0 Then
‘ 【重要】正確な位置を特定して記録する
WScript.Echo “解析エラー発生!”
WScript.Echo “位置: ” & nLine & “行目”
WScript.Echo “詳細: ” & Err.Description
‘ エラーログをDBやテキストへ書き出す処理をここに記述
‘ LogToDatabase nLine, nColumn, Err.Description
Err.Clear
Exit Do
End If
Loop
On Error GoTo 0 ‘ エラーハンドラを戻す
objFile.Close
Set objFile = Nothing
Set objFSO = Nothing
End Sub
‘ 簡易的なバリデーションロジック
Function ValidateLine(strLine)
‘ 実際の実務ではここで正規表現などを用いて厳密に判定する
ValidateLine = True
End Function
—
プロフェッショナルとしての注意点
このコードを実務で運用する際、以下の3点を徹底してほしい。
1. `AtEndOfStream` と `ReadLine` の順序
`ReadLine` を呼ぶと、内部ポインタは自動的に次の行へ移動する。エラーが発生した行をログに残したい場合、必ず `ReadLine` の直前に `Line` プロパティを読み取っておくこと。これを忘れると、ログには常に「エラー発生行の次の行」が表示されるという悲劇が起こる。
2. ファイルロックへの配慮
FSOでの読み込みは、システム共有違反(他のプロセスがファイルを掴んでいる状態)に対して極めて脆弱だ。`On Error Resume Next` を活用し、`OpenTextFile` 実行時に `Err.Number` をチェックするガード節を必ず設けること。
3. 文字コードの罠
VBScriptの `OpenTextFile` はデフォルトで「ASCII」を前提とするケースが多い。UnicodeやUTF-8を扱う場合は、第4引数(`Format`)に `-1` (TristateUnicode) を指定するのを忘れてはならない。これを怠ると、日本語の文字化けでパースロジックが誤作動し、原因不明のデバッグに数時間を溶かすことになる。
—
結論:自動化とは「予見」である
優れたエンジニアは、コードが「動くこと」を喜ぶのではない。「エラーが起きたときに、いかにして最小のコストで復旧できるか」という設計に魂を込める。
今回紹介した `Line` および `Column` プロパティの活用は、単なる小手先のテクニックではなく、「運用保守の負担をゼロに近づけるための構造的防御」である。今日から君のツールにこの設計を組み込み、泥臭いデバッグ作業から解放されることを期待する。
何か疑問があれば、いつでもコードの深淵を覗きに来るといい。健闘を祈る。
