VBScriptを掌握する:ネストされたDictionaryを「フラット」に解き放つ技術
こんにちは。自動化の世界へようこそ。
VBScriptという言語は、一見古風に見えるかもしれません。しかし、Windowsの心臓部を直接叩けるこの言語は、今なおレガシーシステムの裏側で、あるいは小回りの利く自動化ツールとして、伝説的な輝きを放ち続けています。
今日は、多くのエンジニアが「階層データ」の深淵で迷子になる、「ネストされたDictionaryのフラット化」という課題を攻略しましょう。
—
なぜ「フラット化」が必要なのか?
例えば、JSONデータや複雑な設定ファイルを読み込むとき、データは以下のように階層構造(木構造)でやってきます。
- `Server`
- `Database`
- `Host: “localhost”`
- `Port: 3306`
このままでは、ループ処理やデータベースへの保存が非常に面倒です。これを `Server.Database.Host = “localhost”` という風に、「ドット繋ぎの1次元キー」に変換できれば、どんなデータも一気に扱いやすくなります。
—
アルゴリズムの核:再帰的探索(Recursion)
この問題を解決する鍵は「再帰処理」です。
「自分がDictionaryを見つけたら、その中身をさらに掘り下げる。それ以外なら値を記録する」という思考を関数に落とし込みます。
実装コード:`FlattenDictionary` 関数
以下のコードをコピーして、`.vbs` ファイルとして保存し、実行してみてください。
‘ — メイン実行部 —
Set objRoot = CreateObject(“Scripting.Dictionary”)
Set objDB = CreateObject(“Scripting.Dictionary”)
‘ 階層データを作成
objDB.Add “Host”, “localhost”
objDB.Add “Port”, 3306
objRoot.Add “Server”, objDB
objRoot.Add “Version”, “1.0.0”
‘ 変換用コンテナ
Set objFlat = CreateObject(“Scripting.Dictionary”)
‘ 変換実行
FlattenDictionary objRoot, “”, objFlat
‘ 結果の表示
For Each key In objFlat.Keys
WScript.Echo key & ” = ” & objFlat(key)
Next
‘ — 再帰的フラット化関数 —
Sub FlattenDictionary(dict, prefix, result)
Dim key, val, newKey
For Each key In dict.Keys
Set val = dict(key)
‘ プレフィックスの構築
If prefix = “” Then
newKey = key
Else
newKey = prefix & “.” & key
End If
‘ 型判定:さらにDictionaryかを確認する
‘ VBScriptではTypeNameを使うのが鉄則です
If TypeName(val) = “Dictionary” Then
‘ まだ階層がある場合は、自分自身を呼び出す(再帰)
FlattenDictionary val, newKey, result
Else
‘ 終端に達したら結果用Dictionaryに格納
result.Add newKey, val
End If
Next
End Sub
—
コードのここがポイント!
1. `TypeName(val) = “Dictionary”` の魔法
VBScriptにおいて、型を厳密に判別するのは重要です。`IsObject`だけでは他のオブジェクトと区別がつかない場合がありますが、`TypeName`を使えば、その変数が本当に「Dictionary」なのかを確実に仕分けできます。
2. `prefix` 引数の伝播
再帰呼び出しの中で「今の階層までどのルートを通ったか」を文字列として引き継ぐのが、フラット化のコツです。これが「親.子.孫」というパスを生成する源泉になります。
3. 参照渡しと値渡し
VBScriptの引数はデフォルトで参照渡しですが、こうした構造体を操作する際は、明示的にオブジェクトとして扱う意識が重要です。
—
陥りやすい罠と対策
- 循環参照(Circular Reference):
もしDictionaryの中に自分自身が含まれるような構造があると、再帰が無限ループしてVBScriptは停止します。実務では、`depth`カウンターを設けて、一定階層以上は掘らないようなガードレールを敷くのが「プロの設計」です。
- キーの重複:
フラット化した際に、キーが衝突しないように命名規則を設計してください。このアルゴリズムでは「ドット」で区切ることで、階層の違いをキー名に含めて衝突を回避しています。
—
最後に:自動化エンジニアへの第一歩
この「再帰によるフラット化」をマスターすれば、JSON解析、XMLの読み込み、複雑な設定値のパースなど、どんなデータ構造もあなたの手の上で自由に操れるようになります。
VBScriptは古い言語ですが、「本質的なデータ構造をどう解釈するか」というプログラミングの基礎体力は、どんなモダン言語に移っても通用する一生モノのスキルです。
次は、このフラット化したデータをCSVに書き出す処理を書いてみてください。それが、あなたの自動化エンジニアとしての最初の一歩になるはずです。
何か詰まったら、いつでも戻ってきてください。この場所で、また次の知見を共有しましょう。
