【実務・中級編】【初心者向け】TextStreamのColumnおよびLineプロパティを用いたテキスト解析エラー位置の正確な特定 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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` プロパティの活用は、単なる小手先のテクニックではなく、「運用保守の負担をゼロに近づけるための構造的防御」である。今日から君のツールにこの設計を組み込み、泥臭いデバッグ作業から解放されることを期待する。

何か疑問があれば、いつでもコードの深淵を覗きに来るといい。健闘を祈る。

タイトルとURLをコピーしました