はじめに
この投稿は、RPAツール「UiPath」の データテーブル の操作方法について「個人的に」まとめたものです。
量が多いので、数回に分けて書きます。
この記事は、UiPath Friends もくもく会 2021年5月開催(5-28(土)08:45 - 12:00)で書きました。
データテーブルの操作 シリーズ
DataTableの操作方法について記載した記事が、他にもあります。参考まで。
データテーブルをデバッグ出力したい
ロボットの処理中に、データテーブルをログに出力したいときがあります。
「中身がどうなっているか?」を確認したいときです。
出力方法は以下の2つが挙げられます
No | 出力方法 | メリット | デメリット |
---|---|---|---|
1 |
データテーブルを出力 アクティビティで文字列に出力 |
標準アクティビティ だけ簡単に出来る |
変数の用意が必要 フォーマットが固定 |
2 | Linq で文字列を抽出して出力 | メッセージをログ アクティビティだけで完結 |
Linqに慣れが必要 |
以下でそれぞれ説明します。
データテーブルを出力 アクティビティ
UiPath 標準の「データ テーブルを出力 (Output Data Table) 」アクティビティ を使用すると、DataTable を文字列に出力できます。
ログ出力するには、String型の変数を宣言し、以下のように「メッセージをログ」アクティビティでログ出力します。
アクティビティで出力される際のフォーマットは以下のようになっています。
ColumName1,ColumName2,ColumName3,… '// 1行目は列定義。カンマ区切り
ValueA1,ValueB1,ValueBC,… '// 2行目からデータ。カンマ区切り
ValueA2,ValueB2,ValueC2,…
ValueA3,ValueB3,ValueC3,…
…
既存アクティビティだけで簡単に出力できるのですが、出力先の変数の用意
が必要です。また、フォーマットが固定
で変更できません。
LINQ で作成した文字列を出力
LINQ を使って DataTable の中身を文字列に変換します。
「メッセージをログ」アクティビティのメッセージボックス欄に LINQ を直接入れます。(出力文字列の変数は不要です)
LINQ の内容を変えれば好みのフォーマットに変更できるのもメリットです。
LINQ には「メソッド構文
」と「クエリ式
」という2種類の書き方がありますが、以下にそれぞれサンプルを記載します。
「メッセージをログ」アクティビティのメッセージボックスに、そのままセットして使用できます)
1)LINQ:メソッド構文(ドットでつなげる書き方)
'// A)列は「カンマ」区切り、行は「改行」区切り
String.Join(",", dt.Columns.Cast(Of DataColumn).Select(Function(c As DataColumn) c.ColumnName.ToString).ToArray) & ControlChars.NewLine & _
String.Join(ControlChars.NewLine, dt.AsEnumerable.Select(Function(r As DataRow) String.Join(",", r.ItemArray)).ToArray)
'// B)列は「Tab」区切り、行は「改行」区切り
String.Join(ControlChars.Tab, dt.Columns.Cast(Of DataColumn).Select(Function(c As DataColumn) c.ColumnName.ToString).ToArray) & ControlChars.NewLine & _
String.Join(ControlChars.NewLine, dt.AsEnumerable.Select(Function(r As DataRow) String.Join(ControlChars.Tab, r.ItemArray)).ToArray)
'// C)列は「Tab」区切り、行は「改行」区切り、データは最大2件のみ
String.Join(ControlChars.Tab, dt.Columns.Cast(Of DataColumn).Select(Function(c As DataColumn) c.ColumnName.ToString).ToArray) & ControlChars.NewLine & _
String.Join(ControlChars.NewLine, dt.AsEnumerable.Select(Function(r As DataRow) String.Join(ControlChars.Tab, r.ItemArray)).Take(2).ToArray)
基本的に、上記の3つでやっていることは同じ です。
少しだけ、何をしているのかを説明すると、
String.Join(",",
dt.Columns.Cast(Of DataColumn).Select(
Function(c As DataColumn) c.ColumnName.ToString
).ToArray
)
これは、見出し行を作成しています。
String.Join(",",
で配列をカンマで区切って
dt.Columns.Cast(Of DataColumn)
でDataTableから列定義を取り出して
.Select(Function(c As DataColumn) c.ColumnName.ToString)
で列定義から列名を取り出して
.ToArray
で取り出した列名を配列にします(カンマで区切れるように)
という感じです。同じように、データの中身もdt.AsEnumerable.Select。。。
で取得して、改行で区切っています。
2)LINQ:クエリ式(Fromなどの構文を半角スペースでつなぐ書き方)
'// A)列は「カンマ」区切り、行は「改行」区切り
String.Join(",", (From c As DataColumn In dt.Columns.Cast(Of DataColumn) Select c.ColumnName).ToArray) & ControlChars.NewLine & _
String.Join(ControlChars.NewLine, From r As DataRow In dt.AsEnumerable Select String.Join(",", r.ItemArray))
'// B)列は「Tab」区切り、行は「改行」区切り
String.Join(ControlChars.Tab, (From c As DataColumn In dt.Columns.Cast(Of DataColumn) Select c.ColumnName).ToArray) & ControlChars.NewLine & _
String.Join(ControlChars.NewLine, From r As DataRow In dt.AsEnumerable Select String.Join(ControlChars.Tab, r.ItemArray))
'// C)列は「Tab」区切り、行は「改行」区切り、データは最大2件のみ
String.Join(ControlChars.Tab, (From c As DataColumn In dt.Columns.Cast(Of DataColumn) Select c.ColumnName).ToArray) & ControlChars.NewLine & _
String.Join(ControlChars.NewLine, (From r As DataRow In dt.AsEnumerable Select String.Join(ControlChars.Tab, r.ItemArray)).Take(2))
同じワークフロー内で、何回も呼び出す場合は、変数として定義すると便利です。
変数パネルの規定値でセットしても構いません。代入する関数は、例えば以下のような内容です。
(上記のサンプルの先頭に「Function(dt As DataTable)」を足します)
Function(dt As DataTable) String.Join(",", (From c As DataColumn In dt.Columns.Cast(Of DataColumn) Select c.ColumnName).ToArray) & ControlChars.NewLine & String.Join(ControlChars.NewLine, From r As DataRow In dt.AsEnumerable Select String.Join(",", r.ItemArray))
この変数を利用すると、以下のようにデバッグ出力を指定できます。
終わりに
以上、DataTableのデバッグについて でした。なにかの役に立てば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。