【実務・中級編】【実務中級者向け】FSOで読み込んだCSVデータの列数・型チェックを行うデータクレンジング&エラー行自動抽出 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptでCSVを「叩き斬る」:FSOを極めた堅牢なデータ検品エンジンの設計思想

現場でよく見る「動けばいい」という甘いコードは、データ量が数万件を超えた瞬間にメモリリークを起こすか、予期せぬ文字化けでシステムを停止させる。
VBScriptはレガシーだが、その挙動を制御しきれば、これほど軽量かつ強力な自動化ツールはない。今回は、FSO(FileSystemObject)を駆使して、「汚れたCSVを検品し、エラー行だけを隔離する」という、実務で最も要求されるクリティカルなロジックを伝授する。

—

なぜ「一括読み込み」は悪手なのか

多くの初心者は `ReadAll` でファイルを全展開し、配列に格納しようとする。だが、数GBのログファイルや複雑なエンコーディングのCSVを相手にする際、それは自殺行為だ。

我々が取るべきアプローチは「ストリーム・プロセス」だ。
1行ずつバッファを回し、メモリ負荷を定数に抑える。この設計こそが、サーバー負荷を気にせず、どんな巨大なデータにも立ち向かえるプロの作法である。

—

プロダクション・グレード:CSV検品ツール実装コード

このコードは、型チェックと列数整合性を同時に行う。特筆すべきは、「エラーログを別ファイルへストリーミングする」点だ。これにより、処理が終わった瞬間に「何が問題だったのか」が即座に可視化される。

‘ クリーンな実行のための宣言
Option Explicit

Const ForReading = 1, ForWriting = 2
Dim fso, tsInput, tsError, strLine, lineNum
Dim arrFields, expectedCols

‘ 設定:列数期待値
expectedCols = 4

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルを開く(入力を読み取り専用、エラーログを新規作成)
Set tsInput = fso.OpenTextFile(“data_import.csv”, ForReading)
Set tsError = fso.CreateTextFile(“error_log.csv”, True)

lineNum = 0
tsError.WriteLine “Line,Content,ErrorMessage”

Do Until tsInput.AtEndOfStream
lineNum = lineNum + 1
strLine = tsInput.ReadLine

‘ 空行スキップの鉄則
If Trim(strLine) <> “” Then
arrFields = Split(strLine, “,”)

‘ 1. 列数チェック
If UBound(arrFields) + 1 <> expectedCols Then
tsError.WriteLine lineNum & “,””” & strLine & “””,列数不一致”

‘ 2. 型チェック(例:第3列が数値であること)
ElseIf Not IsNumeric(arrFields(2)) Then
tsError.WriteLine lineNum & “,””” & strLine & “””,第3列の型不正”
End If
End If
Loop

tsInput.Close
tsError.Close

MsgBox “検品完了。エラー詳細は error_log.csv を確認してください。”, 64, “自動化システム”

—

開発における「3つの鉄則」

現場でバグを生まないために、以下のポイントを心に刻んでほしい。

1. 文字コードの罠(ADODB.Streamの活用)

上記のFSOは、日本語環境ではShift-JISしか扱えない。UTF-8で保存されたCSVを扱う場合は、FSOではなく `ADODB.Stream` を使用して `Charset = “UTF-8″` を明示的に指定せよ。これができないエンジニアは、文字化けという「終わりのないデバッグ」から一生抜け出せない。

2. 「ダブルクォーテーション」の処理

CSVにおいて、フィールド内にカンマが含まれる場合(例: `”東京都,千代田区”`)、単純な `Split` 関数は無力だ。実務では正規表現(RegExp)を用いて、引用符内のカンマを保護するロジックを組み込むのが、「真に堅牢」といえる。

3. エラーハンドリングの意識

`On Error Resume Next` を多用するのは素人の仕事だ。必要な箇所だけ局所的にエラーをトラップし、`Err.Number` を確認した後は速やかに `On Error GoTo 0` で戻すこと。例外を握りつぶすな、例外を可視化せよ。

—

最後に:自動化とは「思考の自動化」である

このツールは、単なるテキスト処理機ではない。データを取り込む前に「異物」を排除するフィルターだ。
エンジニアの仕事は、コードを書くことではなく、「後続のシステムが絶対に失敗しない環境を整えること」にある。

このコードをベースに、君の現場の仕様に合わせて微調整してほしい。それができれば、君のチームから「データの不整合による緊急呼び出し」は消滅するはずだ。

健闘を祈る。

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