WSH VBScript で多次元の連想配列を扱う

WSHは何気に便利で、仕事のメインPCはWindowsなので、よく使います。WindowsのバッチコマンドはUNIXのshに比べるとちょっと不便ですが、WSHプログラマにとってはExcelマクロ等でなじみ深い文法、そしてWindowsがバージョンアップしてもWSHが使えなくなることはほぼないので、一度覚えれば保守性もあります。

 

 

最近の開発で多次元の連想配列を使いたい案件があったので、勉強してみました。備忘のためにサンプルソースを載せておきます。

 

sample.vbs ←ファイル名

以下ソース

Option ExplicitOption Explicit

 

'1階層めの連想配列

Dim dicCarsSet dicCars = CreateObject("Scripting.Dictionary")

 

Call dicCars.Add("TOYOTA", CreateObject("Scripting.Dictionary"))

Call dicCars.Add("HONDA", CreateObject("Scripting.Dictionary"))

Call dicCars.Add("NISSAN", CreateObject("Scripting.Dictionary"))

 

'2階層めの連想配列

Call dicCars.Item("TOYOTA").Add("2000GT", "SportsCar")

Call dicCars.Item("TOYOTA").Add("Supra", "SportsCar")

Call dicCars.Item("TOYOTA").Add("Alphard", "MiniVan")

Call dicCars.Item("HONDA").Add("NSX", "SuperCar")

Call dicCars.Item("HONDA").Add("S2000", "SportsCar")

Call dicCars.Item("HONDA").Add("Odyssey", "MiniVan")

Call dicCars.Item("HONDA").Add("Insight", "HybridCar")

Call dicCars.Item("NISSAN").Add("S30Z", "SportsCar")

Call dicCars.Item("NISSAN").Add("GT-R", "SuperCar")

 

'連想配列の中身を表示

WScript.Echo "--- Initial Set ---"
Dim key1, key2

For Each key1 In dicCars

    For Each key2 In dicCars.Item(key1)

        WScript.Echo key1 & "," & key2 & ", " & dicCars.Item(key1).Item(key2)

    Next

Next

 

'連想配列の中身を変更

 If dicCars.Item("HONDA").Exists("Odyssey") Then

    dicCars.Item("HONDA").Item("Odyssey") = "HybridMiniVan"

End If

 

WScript.Echo vbCrLf

 

'変更後の連想配列の中身を表示

WScript.Echo "--- After Modify ---"

For Each key1 In dicCars

    For Each key2 In dicCars.Item(key1)

        WScript.Echo key1 & "," & key2 & ", " & dicCars.Item(key1).Item(key2)

    Next

Next

 

 

 

これをコマンドプロンプトからcscriptで実行した結果は以下のようになります。

 

cscript sample.vbs

 

--- Initial Set ---
TOYOTA,2000GT, SportsCar
TOYOTA,Supra, SportsCar
TOYOTA,Alphard, MiniVan
HONDA,NSX, SuperCar
HONDA,S2000, SportsCar
HONDA,Odyssey, MiniVan
HONDA,Insight, HybridCar
NISSAN,S30Z, SportsCar
NISSAN,GT-R, SuperCar


--- After Modify ---
TOYOTA,2000GT, SportsCar
TOYOTA,Supra, SportsCar
TOYOTA,Alphard, MiniVan
HONDA,NSX, SuperCar
HONDA,S2000, SportsCar
HONDA,Odyssey, HybridMiniVan
HONDA,Insight, HybridCar
NISSAN,S30Z, SportsCar
NISSAN,GT-R, SuperCar

 

 

 

1階層目のkey-valueを設定する際に、valueに"Scripting Dictionary"を設定するところがミソでした。あとはjavajavascriptに近い感覚で扱えます。

 

 

ではでは。今日はここまで。