【極限のVBScript】機密情報を守る「データ匿名化パイプライン」の構築術 〜FSOと正規表現で挑むプロの現場〜
こんにちは。現場の自動化を支えるアーキテクトへようこそ。
「マクロの記録」から一歩踏み出し、「自分でロジックを組み立てたい」――そう思ったあなたは、エンジニアとして非常に素晴らしいステップに立っています。
今日、私たちが挑戦するのは、単なる「ファイルのコピー」ではありません。本番環境にある膨大なログファイルの中から、マイナンバーやクレジットカード番号といった「絶対に漏洩させてはいけない機密情報」を自動で見つけ出し、安全な形式(伏字)に書き換える「データ匿名化パイプライン」の構築です。
これを使えば、本番のログをテスト環境へ持ち込む際、セキュリティリスクを極限まで抑えることができます。さあ、VBScriptの真の力を解き放つ準備はできましたか? ここをクリアすれば、VBScriptの基本はバッチリですよ。
1. 今回の武器(使用するオブジェクト)
この任務を遂行するために、私たちは2つの強力な「道具」を使いこなす必要があります。
① FileSystemObject (FSO) :「ファイル操作の腕」
FSOは、Windowsのファイルシステム(フォルダの作成、ファイルの読み書き、存在確認など)を自在に操るためのオブジェクトです。これがないと、プログラムはファイルという「実体」に触れることすらできません。
② RegExp (Regular Expression) :「パターン検知の目」
正規表現(RegExp)は、特定の「文字列のパターン」を高速に検索するエンジンのことです。「数字が12個並んでいるもの」や「ハイフンで区切られた番号」といった複雑な条件を、たった一行のルールで定義できます。
2. プロフェッショナルの設計思想:なぜ「一行ずつ」なのか?
ここで、初級者とプロフェッショナルの決定的な違いについてお話ししておきましょう。
多くの初学者は、ファイルを読み込む際、`ReadAll`(ファイル全部を一気にメモリに読み込む)というメソッドを使いがちです。しかし、本番環境のログファイルが数GB(ギガバイト)あったらどうなるでしょう? PCのメモリは一瞬で枯渇し、システムはクラッシュします。
プロフェッショナルは「ストリーム処理(一行ずつ読み込み、一行ずつ書き出す)」を選択します。これなら、どんなに巨大なファイルであっても、メモリ消費を最小限に抑え、安定して動作させることができます。これが「パイプライン」と呼ばれる所以です。
3. 実装:データ匿名化スクリプト
それでは、実際のコードを見ていきましょう。このコードは、そのまま `.vbs` ファイルとして保存して実行できる構成にしています。
' ==========================================================================
' 業務自動化エンジニア向け:データ匿名化パイプライン
' 概要:ログファイル内のマイナンバー(12桁)を検知し、伏字化して出力する
' ==========================================================================
Option Explicit ' 変数の宣言を強制(バグを防ぐための鉄則です!)
' --- 設定エリア ---
Dim strInputFile, strOutputFile
strInputFile = "C:\temp\production_log.txt" ' 読み込み元(本番ログ)
strOutputFile = "C:\temp\anonymized_log.txt" ' 書き出し先(テスト用)
' --- メイン処理の呼び出し ---
Call RunAnonymizationPipeline(strInputFile, strOutputFile)
' ==========================================================================
' メインパイプライン関数
' ==========================================================================
Sub RunAnonymizationPipeline(inputFile, outputFile)
Dim objFSO, objRegExp, objInFile, objOutFile
Dim strLine, strMaskedLine
' 1. オブジェクトの生成
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = CreateObject("VBScript.RegExp")
' 2. 正規表現パターンの設定
' パターン解説: \b は単語の境界、\d{12} は数字12個、\b は終了
' これにより、13桁以上の数字の一部を誤検知するのを防ぎます
With objRegExp
.Pattern = "\b\d{12}\b" ' マイナンバー(12桁の数字)をターゲット
.Global = True ' ファイル内の全ての該当箇所を置換
.IgnoreCase = True
End With
' 3. ファイルの存在確認
If Not objFSO.FileExists(inputFile) Then
MsgBox "エラー: 入力ファイルが見つかりません。" & vbCrLf & inputFile, vbCritical
Exit Sub
End If
On Error Resume Next ' エラーハンドリングの準備
' 4. ファイルを開く(読み込みモード & 書き出しモード)
Set objInFile = objFSO.OpenTextFile(inputFile, 1) ' 1 = ForReading
Set objOutFile = objFSO.CreateTextFile(outputFile, True) ' True = Overwrite
If Err.Number <> 0 Then
MsgBox "ファイルオープン中にエラーが発生しました: " & Err.Description, vbCritical
Exit Sub
End If
On Error GoTo 0 ' エラーハンドリングを通常に戻す
' 5. ストリーム処理(一行ずつ読み込んで処理する)
Do Until objInFile.AtEndOfStream
strLine = objInFile.ReadLine ' 一行読み込み
' 正規表現を使って機密情報を「」に置換
' Replaceメソッドで、パターンに一致した部分をマスクします
strMaskedLine = objRegExp.Replace(strLine, "")
' マスク済みの行を新しいファイルに書き出す
objOutFile.WriteLine strMaskedLine
Loop
' 6. 後始末(オブジェクトの解放)
' これを忘れると、ファイルが「使用中」のままロックされてしまいます!
objInFile.Close
objOutFile.Close
Set objInFile = Nothing
Set objOutFile = Nothing
Set objFSO = Nothing
Set objRegExp = Nothing
MsgBox "匿名化処理が完了しました!" & vbCrLf & "出力先: " & outputFile, vbInformation
End Sub
4. コードの深掘り:ここがプロのポイント
境界線(`\b`)の重要性
正規表現のパターンで `\b` を使いましたね。これは「単語の境界」を意味します。
例えば、`123456789012345`(15桁)という数字があったとき、`\d{12}` だけだと、その中の最初の12桁を無理やりマスクしてしまいます。`\b` を使うことで、「前後が数字ではない、独立した12桁の塊」だけを正確に狙い撃ちできるのです。
オブジェクトのライフサイクル
コードの最後で `Set obj = Nothing` としています。
VBScriptにおいて、オブジェクトを使い終わったら明示的に解放するのは、大規模なシステムを運用する上での「マナー」であり「安全策」です。特にファイル操作の場合、これを忘れると、プログラム終了後もファイルが掴まれたままになり、他のプロセスがそのファイルを削除・移動できなくなるトラブル(ファイルロック)を引き起こします。
5. 陥りやすい罠と対策(トラブルシューティング)
現場で遭遇する「なぜ動かないんだ!」を防ぐための知恵を授けます。
| 現象 | 原因 | 対策 |
|---|---|---|
| 文字化けが発生する | FSOは標準でANSI(Shift-JIS)を扱います。UTF-8のファイルを読み込むと壊れます。 | UTF-8を扱う場合は、FSOではなく `ADODB.Stream` オブジェクトを使用してください。 |
| ファイルが書き込めない | 出力先のファイルが他のプログラム(Excel等)で開かれている。 | ファイルを閉じてから実行するか、エラーハンドリングで検知してください。 |
| 置換が一部しか行われない | `objRegExp.Global = True` を忘れている。 | `Global` プロパティを `True` に設定しないと、一行の中で最初に見つかった1箇所しか置換されません。 |
最後に
お疲れ様でした! これであなたは、単に「動くコード」を書く段階から、「安全で、効率的で、堅牢なシステム」を設計する段階へと進化しました。
VBScriptは決して古い言語ではありません。Windows環境における自動化の強力な武器です。今回学んだ「FSOによるストリーム処理」と「RegExpによるパターンマッチング」の組み合わせは、他の言語(PythonやPowerShell)でも共通する、極めて重要なエンジニアリングの基礎です。
この知識を武器に、ぜひ現場の課題を解決していってください。応援していますよ!
