【入門編】【階層構造データのフラット化】ネストされたDictionaryやコレクション構造を1次元のキーバリュー形式へ展開するアルゴリズム – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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に書き出す処理を書いてみてください。それが、あなたの自動化エンジニアとしての最初の一歩になるはずです。

何か詰まったら、いつでも戻ってきてください。この場所で、また次の知見を共有しましょう。

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