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"を設定するところがミソでした。あとはjavaやjavascriptに近い感覚で扱えます。
ではでは。今日はここまで。