【VBScript極意】数ギガの巨大CSVを「FSO」で最速抽出する職人技術
こんにちは。自動化の世界へようこそ。
Excelのマクロ記録から一歩踏み出し、OSの深淵である「VBScript」と「FSO(FileSystemObject)」を使いこなそうとしているあなたを、私は心から歓迎します。
「数万、数百万行のCSVをExcelで開こうとしてフリーズした……」
そんな経験はありませんか? Excelは高機能ですが、巨大なテキストデータを扱うには「重すぎる」道具です。
今回は、VBScriptの真骨頂である「ストリーム処理」を使い、メモリを一切圧迫せずに、数ギガバイトの巨大CSVから必要なデータだけを抽出する「職人のバッチ処理」を伝授します。
—
1. なぜ「FSO」が最強なのか?
VBScriptでファイルを扱う際、最も重要かつ強力なオブジェクトが FileSystemObject (FSO) です。
FSOの凄さは、「ファイルを一気にメモリに読み込まないこと」にあります。1行ずつ読み込み、条件を判定し、書き出す。この「一筆書き」の処理こそが、数兆行規模のデータでもシステムを止めずに完走させる秘訣です。
陥りやすい罠:一括読み込みの悲劇
初学者がやりがちなのは、`ReadAll` メソッドでファイルを丸ごとメモリにぶち込むこと。これでは数GBのファイルを開いた瞬間にメモリ不足でスクリプトがクラッシュします。私たちは「川の水をコップで汲むように」処理するのです。
—
2. 巨大CSV抽出の「職人コード」
以下のコードは、指定したCSVから「特定のステータス(例: “完了”)」を含む行だけを抽出し、別のファイルに書き出すためのテンプレートです。
‘ FSOのインスタンス化
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 入出力パスの設定
strInputPath = “C:\Data\HugeData.csv”
strOutputPath = “C:\Data\ExtractedData.csv”
‘ 読み込み専用でファイルを開く (ForReading = 1)
Set tsInput = fso.OpenTextFile(strInputPath, 1)
‘ 書き込み用に新しいファイルを作成 (Create = True)
Set tsOutput = fso.CreateTextFile(strOutputPath, True)
‘ ファイルの終わり(AtEndOfStream)までループ
Do Until tsInput.AtEndOfStream
‘ 1行ずつ読み込む
strLine = tsInput.ReadLine
‘ 【ここが抽出ロジック】
‘ 例:カンマ区切りの3番目の項目が”完了”であるか判定
arrCols = Split(strLine, “,”)
‘ 配列の要素数チェック(空行エラー防止の知恵)
If UBound(arrCols) >= 2 Then
If arrCols(2) = “完了” Then
‘ 条件一致なら書き出し
tsOutput.WriteLine strLine
End If
End If
Loop
‘ 資源の解放(重要!)
tsInput.Close
tsOutput.Close
Set tsInput = Nothing
Set tsOutput = Nothing
Set fso = Nothing
MsgBox “処理が完了しました。”
—
3. このコードを「現場の武器」にするための3つの知見
① `Split` 関数の限界を知る
`Split` は便利ですが、CSVの中にカンマが含まれている(例: “東京都,千代田区”)場合は正しく分解できません。その場合は、正規表現(RegExp)を組み合わせるか、自作のパーサーを通す必要があります。まずは「カンマを含まない単純なCSV」から始めてみましょう。
② メモリ解放(Nothingの儀式)
VBScriptは古い言語です。`Set obj = Nothing` を書かなくてもスクリプト終了時に自動解放されますが、大きなループ処理の中では明示的に閉じる・解放するのが一流の作法です。これが大規模バッチでのメモリリークを防ぐ唯一の道です。
③ エラーハンドリングの重要性
業務で使う場合、必ず `On Error Resume Next` を検討してください。特定の行だけ文字コードがおかしくてエラーになっても、処理全体を止めない工夫(ログファイルへの書き出しなど)を入れることで、真夜中のバッチ処理が朝まで止まらない堅牢なシステムになります。
—
最後に:自動化のプロへ
VBScriptは「古い」と言われることもあります。しかし、インストール不要でWindows環境ならどこでも動くこの軽量さは、現代の重厚なフレームワークにも負けない「究極のポータビリティ」を持っています。
このコードをベースに、日付範囲でフィルターをかけたり、複数のCSVをマージしたりと、あなたの業務に合わせてカスタマイズしてみてください。
「動いた!」という感動から、「エラーを予測して止まらないコードを書く」という職人の領域へ。あなたの自動化ライフを心から応援しています。
何か躓いたことがあれば、またいつでも聞きに来てください。一緒に最強の自動化環境を築きましょう!
