Blue PrismでExcelを操作する<詳細版⑧> Append Field (Text) でコレクションに列を追加する
今日は、ちょっとマニアックな話をします。
- Blue Prismのコレクション操作は超重要
- Collection Manipulation の Append Field(Text)
- Append Field (Text)
- 実験結果の考察(というか、推測)
- Append Field (Text) は再帰呼出しができないのか?
- たとえばこんなことができる:行列の転置、つまり行と列の置き換え
- まとめ
Blue Prismのコレクション操作は超重要
Blue Prismを使う場合、コレクション(要は配列)の操作が必要な場面に多く出くわすと思います。
Excelからデータを読んだり書いたりする場合、ほとんどの場合、データはリスト形式だったり、テーブル形式だったりしますよね。
これらはBlue Prismでは、すべてコレクションとして扱われます。
Excelだけでなく、Webシステムやクラサバを扱う際も、リスト形式、テーブル形式のデータは頻出します。
したがって、Blue Prismにおいて、コレクションの操作は超重要な機能…だと思います。
ただ、ここだけの話、Blue Prismのコレクション操作って、結構、クセが強くないですか?
慣れればどうってことないのかもしれませんが、ブェー(断末魔)みたいな思いをすることが無きにしも非ず。
今日はそんなコレクション操作で苦労した話です。
なお、先に断っておきますと、VBOの Collection Manipulation は、私が作っているわけではないので、以下は実験結果および考察です。一利用者の意見としてとらえていただけますと幸いです。
Collection Manipulation の Append Field(Text)
Blue Prismでコレクションを操作するには、VBOの BPA Object - Utility - Collection Manipulation が欠かせません。
アクションの数も多く、応用次第でいろいろなことができます。
ただ、この Collection Manipulation 、結構、クセがある個性的に感じます。
特に Append Field(Text) は特にクセ球特色のある印象…ムービング・ファスト・ボール的な。。何かちょっと芯が外されるんだよなぁ。
Append Field(Text)は、あるコレクションに列を追加するためのアクションです。入出力は以下のような感じ(勝手訳)です。
Append Field (Text)
コレクションに列を追加します。追加される列に入る値は、テキストになります。
Append Field (Text)の入力
- Collection: 追加前のコレクション
- Field Name: 追加する列の名前
- Value: 追加される列に入る値
Append Field (Text)の出力
- Appended Collection: 列を追加したコレクション
Blue Prismの利用シーンとして、コレクションに列を追加したいことは多いので、割と多用したいアクションですが、以下のようなクセのある挙動をします。
たとえば、以下のようなケースを考えた場合、 Append Field(Text) の結果はどうなるでしょうか。
- 空のコレクションに、 Append Field(Text) で列を追加する
- 既に初期値が設定されているコレクションに Append Field(Text) で列を追加する。ただし、出力には空のコレクションを選択する
- 既に初期値が設定されているコレクションに、 Append Field(Text) で列を追加する。ただし、出力は入力と同じコレクションにする(再帰的な呼出し)
はい、実験してみました。結果はこちら
- 何も起きない。列は追加されないし、エラーも出ない
- 列が追加された形で、コレクションが出力される
- エラーが起きる。
エラー内容は、以下の通りです。
Internal : Collection fields are defined but cannot be matched to the incoming collection - The collection definition does not contain the field フィールド名
実験結果の考察(というか、推測)
何度も言いますが、別に私が Collection Manipulation を作っているわけではないので、以下は推測です。
まず、1.のケースですが、これはおそらくNULL状態のコレクション(おそらく、内部的にはDataTable)に対して、列を増やすという操作がそもそもできない(やり方はあるかもしれないが、通常とは違う方法が必要)のだと思います。Append Field (Text) は、初期値を設定したコレクションしか入力できないわけです。
そして、2.のケースですが、Append Field (Text) した結果は、最初にNULL状態で定義したコレクションにしか出力できないのだと思います。コレクションの列を可変にするには、コレクションの最初の定義をNULLにしておく必要がある…ということなのでしょう。何か列を定義してしまうと、コレクションの定義が定まってしまうのだと思います。
そして、3.のエラーは、 出力時に定義の定まったコレクションを利用しているため、Append Field (Text) の出力時の型のチェックで上記のエラーが起きる…というのが私の推測です。
…この状態だと、Append Field (Text) は、再帰的な呼出しができないことになります。これはちょっと困ったことです。なぜなら、コレクションに列を追加する際に、追加する列の数が可変(動的)になるケースはよくあるからです。
追加する列の数が可変になるのに、再帰的な呼出しが難しい、となると、コレクションの定義を動的に増減させる必要性が出るので、実装できなくなってしまいます。
Append Field (Text) は再帰呼出しができないのか?
…と思うじゃん?
実はできます。
やり方は簡単で、
- 最初にNULL状態で定義したコレクション(X)を用意する
- 初期値を設定したコレクション(Y)を用意する
- XにYを入れる
- Xを Append Field (Text) の入力/出力に使う
こうすることで、 Append Field (Text) を利用する際の要件2つ;
- 初期値を設定したコレクションしか入力できない
- 最初にNULL状態で定義したコレクションにしか出力できない
を同時に満たすことができるので、同じコレクションを入力にも出力にも設定でき、再帰的な呼出しが実現できます。
これにより、追加する列の数が可変になっても、対応できます。
(初期値がいらなければ、後で消しておけばOKです)
たとえばこんなことができる:行列の転置、つまり行と列の置き換え
あんまり良い例ではないかもしれませんが、Append Field (Text) の再帰的な呼出しができると、例えば行列の転置が可能になります。
簡単に手順を書くと以下の通りです。
- 入力された行列から一列を選択する
- 列の値を上から一つずつ読み取って、一行にまとめる(ここでAppend Field (Text) を使用する)
- 一行にまとめたものを、コレクションに追加していく
以下のようなフローになります。
(オブジェクトで作っちゃった。。)
以下のような入力が
こうなります。
行と列の数が可変になっても、上記で処理できます。
やったぜ。
動画も撮ってみました。
まとめ
- Collection Manipulation は、ちょっとクセがある個性的
- 特に Append Field(Text) 、クセが強く特徴的で、一見すると再帰的な呼出しができず、追加する列の数が可変のときに使えないように見える
- しかし、工夫すれば Append Field(Text) も再帰的な呼出しが可能
- うまく使えば、行列の転置とかもできちまうんだ
久しぶりに、まともな記事を書いたな。。
そして仕事は…終わんね…