【実務・中級編】【初心者向け】FSOのSkipおよびSkipLineメソッドを活用したヘッダー行スキップと特定行読み飛ばしテクニック – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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だけでなく、他のいかなる言語を扱う際にも、必ずや「速く、汚れないコード」が書けるようになるはずだ。

さあ、エディタを開け。無駄なループを削ぎ落とし、洗練された自動化ロジックを刻み込むんだ。

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