UiPathでExcelファイルを読み込む際にDictionaryに格納してKeyに紐つくValueを引っ張ってきて…
っていうのをよくやっていました。
が、Blue PrismではDictionary型の変数(Data Item)は使えません。
Blue Prismでは配列=コレクションなのですが、コレクションの指定行の指定列の値を取り出したい場面に遭遇することは多々あると思います。
その度にFilter CollectionしてRead Collection Fieldするのはちょっと面倒。
パフォーマンス的にもちょっと心配。
というわけで、Dictionaryを使って何とか実現できないかやってみました。
方法
コードステージを使い、コレクションをDictionaryに変換後、指定したKeyに紐つくValueを取り出すロジックを記述します。
Dim dic As New Dictionary(Of Integer, String)()
Try
For Each row as DataRow in data.Rows
Dim val1 as String = CStr(row(0))
Dim val2 as String = CStr(row(1))
dic.Add(val1, val2)
Next
Catch ex As System.Exception
result = False
dic = Nothing
Return
End Try
result = True
outputValue = dic(inputValue)
入力
inputValueにはDictionaryのKeyを入れます。
出力
resultはFlag型で、取得が成功した場合はTrue、失敗した場合はFalseを返します。
ソースコード
InitialiseにImport追加
Namespace ImportsにSystem.Collections.Genericを追加します。
これがないと、コードステージでDictionary型の変数宣言でコンパイルエラーになります。
パフォーマンス検証
FilterCollection ⇒ Read Collection Fieldの方法とDictionaryを使う方法、どちらが早いのか検証します。
事前準備として、Excelに50000行のレコードを用意します。
列名は「列1」「列2」とします。(列1:Key 列2:Value)
Excelから50000行のレコードを読み込み、コレクションに格納。
ここまで準備できたらさっそく検証です。
FilterCollection ⇒ Read Collection Fieldの場合
アクション:絞り込み
アクション:値取得
動かしてみる
デバッグスピードは標準
Dictonary変換 ⇒ Keyに紐つくValue取得の場合
動かしてみる
デバッグスピードは標準
結果
50000行のレコードではそれほどスピードに大差はありませんでした。
Dictionary使うもよし、コレクションを絞り込むもよし。
ただ、コレクション絞り込みの方法だと
単純にアクション数が増えてしまうのと、inputの設定が多少面倒なので
Dictionaryを使うメリットはあるかなーと思います。
少しだけDictionary使ったほうが早い気もしますし。。。