VBScriptを掌握せよ:FSOのSkipメソッドによる「無駄な読み込み」の根絶
業務自動化の現場において、VBScriptは「枯れた技術」などではない。OSの深層に根ざし、特別なランタイムなしで即座に駆動する、極めて軽量かつ強力な武器だ。
しかし、多くの初心者が書くコードには、一つの大きな「甘え」がある。それは、「不要な行を読み込んでから、if文で弾く」という無駄なロジックだ。
今回は、FileSystemObject (FSO) の `Skip` および `SkipLine` メソッドを駆使し、メモリ消費を最小限に抑え、コードを美しく保つ「読み飛ばしの極意」を伝授する。
—
なぜ「if文で弾く」のが悪手なのか
多くの初心者は、CSVやログファイルを読み込む際、以下のようなコードを書いてしまう。
‘ 【反面教師の例】
Do Until ts.AtEndOfStream
line = ts.ReadLine
‘ 1行目がヘッダーだからスキップする…というif文
If i > 1 Then
‘ ここで重い処理を行う
End If
i = i + 1
Loop
このアプローチは直感的だが、「メモリに不要な文字列をロードし、CPUサイクルを消費して条件判定を行う」という二重の無駄がある。数千行なら誤差だが、数百万行のログ解析では無視できないパフォーマンス低下を招く。
プロのエンジニアは、「読み込む前に捨てる」。これが鉄則だ。
—
Skip / SkipLine で「読み飛ばし」を実装する
FSOの `TextStream` オブジェクトには、ポインタ(読み込み位置)を直接操作するメソッドが用意されている。
- `Skip(n)`: 文字単位でポインタを進める。
- `SkipLine`: 改行コードまで一気にポインタを進める(1行丸ごと無視)。
これらを使えば、ループの外側で「前処理」を完結させることができる。
—
実践:保守性の高いプロダクションコード
現場でそのまま使える、堅牢なテンプレートを以下に示す。エラーハンドリングとリソース解放の作法を体に叩き込んでほしい。
Option Explicit
Dim fso, ts, filePath
filePath = “C:\logs\data.csv”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ファイル存在チェックは必須。甘えはバグの元だ。
If fso.FileExists(filePath) Then
Set ts = fso.OpenTextFile(filePath, 1) ‘ 1 = ForReading
‘ — ここが本題:ヘッダーを華麗にスキップ —
‘ 1行目はヘッダーなので問答無用で飛ばす
If Not ts.AtEndOfStream Then
ts.SkipLine
End If
‘ 2行目からデータとして処理開始
Do Until ts.AtEndOfStream
Dim currentLine
currentLine = ts.ReadLine
‘ 空行が含まれる場合もここで弾くのがスマート
If Len(Trim(currentLine)) > 0 Then
‘ ここで本来のデータ処理(DB投入や集計)を行う
WScript.Echo “処理中: ” & currentLine
End If
Loop
‘ 最後に必ずクローズ。メモリリークは放置するな。
ts.Close
Else
WScript.Echo “対象ファイルが見つかりません: ” & filePath
End If
Set ts = Nothing
Set fso = Nothing
—
現場で差がつく3つの視点
1. 「何行スキップすべきか」を定数化せよ
ファイル仕様が変わるたびにコード内の数値を書き換えるのは愚策だ。冒頭で `Const HEADER_LINES = 1` のように定義し、ループで回すように設計せよ。変更に強いコードこそが、自動化エンジニアの誇りだ。
2. データベース連携時の注意点
ログファイルを読み込んでDB(SQL Server等)に流し込む際、`Skip` を使わずに空行やヘッダーをDBまで送れば、型変換エラーでジョブが止まる。`Skip` を使うことで、データクレンジングの初期工程をファイルI/Oのレベルで完結できる。
3. バグの起きない「例外」への備え
空ファイルや、1行しかないファイルに対して `SkipLine` を実行すると、`AtEndOfStream` に達してエラーになる可能性がある。`If Not ts.AtEndOfStream Then` によるガード節は、どんなにコードが短くても必ず記述すること。
—
結びに代えて
自動化ツールは「一度書けば終わり」ではない。後任者がメンテナンスし、数年後に自分が修正する可能性を常に考慮せよ。
`Skip` や `SkipLine` を使いこなすことは、単なるメソッドの習得ではない。「データストリームのポインタを制御する」という低レイヤーな意識を持つことだ。この視点があれば、VBScriptだけでなく、他のいかなる言語を扱う際にも、必ずや「速く、汚れないコード」が書けるようになるはずだ。
さあ、エディタを開け。無駄なループを削ぎ落とし、洗練された自動化ロジックを刻み込むんだ。
