はじめに
この記事の執筆は以下の環境で行っています。
UiPathStudio 2021.4.1-beta.177(Community License)
UiPath.Excel.Activities 2.10.4
UiPath.System.Activities 21.4.0
言語:日本語
なにをするの?
DataTableの行を別のDataTableに追加する方法について記述します。
『UiPath データ行のコピー』という検索ワードでヒットする内容では、「メソッドを呼び出し(InvokeMethod)」アクティビティでImportRow
というメソッドを使用する[方法が紹介]されていますが、この記事では「データ行を追加(Add Data Row)」アクティビティのみで完結させる方法を紹介します。
[方法が紹介]:https://forum.uipath.com/t/datatable-datatable/198120
やりたいこと
例えば以下のような家計簿のデータを読み取り、、、
金額が一定額を超えたデータだけを集めた表を作りたい。
そんなケースを想定しています。
やりかた
「繰り返し(データテーブルの各行)(ForEachRow in DataTable)」を使用して、dt_家計簿
を1行ごとにチェックして、条件に合致した場合のみ「データ行を追加(Add Data Row)」でdt_使いすぎ
に行データをコピーします。
この時、「データ行を追加(Add Data Row)」のプロパティには下記のように設定をします。
「列配列」にCurrentRow.ItemArray
と設定するのがポイントとなります。
処理中の行をコピーするので、「行」にCurrentRow
と設定したくなりますが、その場合は実行時に下記のエラーが出てしまうので注意してください。
この行は既に別のテーブルに属しています(This row already belongs to another table.)
.ItemArray
と付けることで「行データ」がテーブルに属さない「列配列」に変換されるので、上記のエラーを回避できます。
補足
CSV以外を読み取ったらどうなるのか
.ItemArray
の返り値はObject
型の配列になるので、元のDataTableの列に型が設定されている場合は、きちんと型の情報を保持してくれます。
下記は今回元データとしたCSVファイルに対して、金額列を数値に書式設定した後にExcelファイルとして保存したものをdt_家計簿_Excel
として読み取ったものです。
ウォッチパネルを使ってUiPath内でどのように読み取られているか直接確認してみます。
3434
という数字がDataTable内でDouble
型になっており、.ItemArray
で変換した後も型情報を保持している事が確認できました。
複数ファイルから値をまとめることもできます
説明の中では1ファイルを対象に絞り込むことだけを行いましたが、202101.csv、202102.csv、202103.csvを順に読み込んで、dt_使いすぎ
に複数ファイル分のデータをまとめることもできます。
実際のロボット開発で使うケースでは、こちらのケースの方が多いかもしれません。
まとめ
データ行を追加(Add Data Row)アクティビティで、あるDataTableの行を別のDataTableに追加したい時にエラーが起きてしまう場合は、行データ(DataRow)
を列配列(Object[])
に変換することでエラーを起こさず追加ができます。
終わりに
メソッドを呼び出し(InvokeMethod)アクティビティは便利ですが、メソッド名の入力時に入力補完が出ないので慣れないうちは使うのが難しいアクティビティです。
今回記事にまとめようと思ったのは、そんな難しいアクティビティを使わずにできる方法を発見した驚きを共有したいと思ったからです。
「データテーブル間のデータのコピー」と言うのは自動化の中でよく使う処理になるので、開発中に誰しも躓いて検索するポイントなんじゃないかと、個人的に思っています。
この記事が、そんな誰かの助けになれば幸いです。