【BluePrism】Dictionaryを使ってみる

UiPathでExcelファイルを読み込む際にDictionaryに格納してKeyに紐つくValueを引っ張ってきて…

っていうのをよくやっていました。

が、BluePrismではDictionary型の変数(Data Item)は使えません。

BPでは配列=コレクションなのですが、コレクションの指定行の指定列の値を取り出したい場面に遭遇することは多々あると思います。

その度にFilter CollectionしてRead Collection Fieldするのはちょっと面倒。

パフォーマンス的にもちょっと心配。

というわけで、Dictionaryを使って何とか実現できないかやってみました。


方法

コードステージを使い、コレクションをDictionaryに変換後、指定したKeyに紐つくValueを取り出すロジックを記述します。

今回は実験なので、ソースは雑ですw


sample

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を入れます。

image.png


出力

resultはFlag型で、取得が成功した場合はTrue、失敗した場合はFalseを返します。

image.png


ソースコード

image.png


InitialiseにImport追加

Namespace ImportsにSystem.Collections.Genericを追加します。

これがないと、コードステージでDictionary型の変数宣言でコンパイルエラーになります。

image.png


パフォーマンス検証

FilterCollection ⇒ Read Collection Fieldの方法Dictionaryを使う方法、どちらが早いのか検証します。

事前準備として、Excelに50000行のレコードを用意します。

列名は「列1」「列2」とします。(列1:Key 列2:Value)

image.png

Excelから50000行のレコードを読み込み、コレクションに格納。

ここまで準備できたらさっそく検証です。


FilterCollection ⇒ Read Collection Fieldの場合

image.png


アクション:絞り込み

image.png

image.png


アクション:値取得

image.png

image.png


動かしてみる

デバッグスピードは標準

test1.gif


Dictonary変換 ⇒ Keyに紐つくValue取得の場合

image.png


動かしてみる

デバッグスピードは標準

test2.gif


結果

50000行のレコードではそれほどスピードに大差はありませんでした。

Dictionary使うもよし、コレクションを絞り込むもよし。

ただ、コレクション絞り込みの方法だと

単純にアクション数が増えてしまうのと、inputの設定が多少面倒なので

Dictionaryを使うメリットはあるかなーと思います。

少しだけDictionary使ったほうが早い気もしますし。。。

今回はコードステージでやってしまいましたが、使う際はちゃんとオブジェクト化しましょう。


余談

取得レコード数が2000~3000行程度でも、Get Worksheet as Collection Offsetが固まる。