4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【UiPath】同じ構造のデータテーブル同士を比較して重複する行を抽出する

4
Posted at

1.テーブルの全列で主キーを設定する
2.比較するテーブル同士をマージする
3.重複する行をDataRowStateから判定して抽出する
という処理で、重複する(完全に一致する)行だけを抽出します。
差分がある(一致しない)行だけを抽出することも可能です。

主キーを使う関係で、テーブル内にNullが含まれると使えません。

処理全体

image.png
①データテーブルの構築
②主キーの設定
③AcceptChangeしてテーブル1にテーブル2をマージ
④テーブル1からModifiedの行を抽出
⑤抽出結果をログ出力
の5つのシーケンスに分けています。
以下で一つずつ見ていきましょう。

①データテーブルの構築

image.png
同じ構造のデータテーブルを2つ作成します。
ここではわかりやすく「データテーブルの構築」アクティビティを使っていますが、
ExcelからReadRangeしたりWebからデータスクレイピングしてデータテーブルを作ってもOKです。

テーブルの内容は以下の通りです。
image.png
赤枠で囲ったレコードがどちらのテーブルにも存在する(重複する)レコードです。
今回はこの赤色のレコードを抽出していきます。

②主キーの設定

image.png
テーブル1の全ての列を使って主キー(正確には複合主キー)を設定します。

DataColumnを格納するコレクション型の変数 dataColumn1 を宣言し、
繰り返しでこの変数にテーブル1の全てのDataColumnを追加、
テーブル1のPrimaryKey(主キー)にdataColumn1 をToArrayで配列に変換し渡す、という流れです。

③AcceptChangeしてテーブル1にテーブル2をマージ

image.png
テーブル1にAcceptChangeメソッドを実行しDataRowStateを取れる状態にした上で、
テーブル1にテーブル2をマージします。

④テーブル1からModifiedの行を抽出

image.png
マージされた側のテーブル1はDataRowStateが以下の3つに分かれています。

  • Added:追加されたレコード = テーブル2だけに存在するレコード
  • Modified:変更されたレコード = 両方のテーブルに存在するレコード
  • Unchanged:変更されていないレコード = テーブル1だけに存在するレコード

GetChangesメソッドでDataRowStateがModifiedのレコードを取得すれば、両方のテーブルに存在する(重複する)レコードを取れることになります。
差分があるレコードを取りたい場合は、DataRowStateがAddedとUnchangedのレコードを取得してマージすればOKです。

⑤抽出結果をログ出力

image.png
抽出したレコード(テーブル)を文字列に変換してログ出力しています。
結果は以下の通りです。
image.png
無事両方のテーブルに存在するレコードだけを抽出できています。
お疲れ様でした。

動作環境

UiPath.System.Activities 21.10.4

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?