1.はじめに
Studioにおけるフィルター操作方法に関して、前回はFilter Data Table ActivityとExcel Filter Activityという2つの方法を紹介しました(興味のある方はこちらをご参照ください)。コードをいじらずにExcelのデータが抽出できる以上の方法は、使いやすくて非常に便利だと言えます。ただし、データ量が膨大で処理のスピードが遅くなったり、フィルター条件が複雑でデータが絞りにくくなったりすることもあります。そのため、今回は、その問題に対応する2つの方法をご紹介しようと思います。
2.Studioで利用できるフィルター操作方法
①Filter Data Table Activity(前編)
②Excel Filter Activity(前編)
③Selectメソッド
④LINQクエリ
3.環境情報
利用する環境は以下の通りとなります。
ソフトウェア名 | バージョン情報 |
---|---|
OS | Windows10 |
Studio | 23.10.0 |
UiPath.EXCEL.Activities | 2.22.2 |
4.データ準備とワークフローの完成図
より容易に本文を理解できるように、筆者は以下のサンプルデータを用意しました。
なお、以下はSelectメソッドやLINQクエリを利用したワークフローの完成図です。ご参照ください。
Selectメソッド
5.具体的な操作方法
③Selectメソッド
Selectメソッドは、データテーブルを操作するメソッドなので、Excelのデータを読み込み、データテーブルとして抽出する必要性があります。
データテーブルにした後、代入アクティビティを配置し、以下の形で書きます。
保存先のDatatable変数=操作対象のDatatable変数.Select(“[列名]='条件'“).CopyToDatatable
文字列のデータに対してフィルターをかける場合、条件をシングルコーテーションで囲みます。例えば、部門をITに限定する場合、 [Department]='IT' と書きます。
数値型のデータに対してフィルターをかける場合、条件の外でシングルコーテーションはいりません。例えば、給料が20000以下のデータに絞りたいとしたら、書き方は [Salary]<20000 となります。
SelectメソッドでITとHR部門にあたったデータを抽出してみましょう。代入式の書き方は以下のようです。
その後、絞ったデータをExcelに書き込んだら、ちゃんとできましたね↓
そのうえ、条件がどんどん増える場合、論理演算子と括弧を組み立て、フィルター条件をつなげばいいと思います。例えば、上記のデータで、さらに給料が20000以下という条件を追加したい場合、書き方は以下のようとなります。
その結果、部門がITかHR、且つ給料が20000以下のデータを取得しました。
④LINQクエリ
LINQ(Language-Integrated Query)は、.NET Frameworkで提供されている言語統合型のクエリ技術です。これは、配列、コレクション、XML文書、データベースといったデータソースに対して、SQLに似たクエリ構文やメソッド呼び出しを使用してデータを効果的にクエリおよび変換するための手段を提供します。 LINQを使用すると、データに対する複雑な操作をより簡潔で読みやすい形で表現できます。UiPath StudioでLINQコードを使用する際には、主にVB.NETのLINQクエリを組み込むことが一般的です。
以下はUiPath StudioでLINQを使用する基本的な手順です。
i.Excelのデータをデータテーブルとして抽出します。(本文において、アウトプットをdbt1に保存します)
ii.代入アクティビティを配置し、左側で絞った結果を格納する変数を作成し、右側はLINQクエリの構文を入れます。絞った対象により、書き方は変わります。
ケース | 構文 |
---|---|
数値フィルター | 保存先のDatatable変数=操作対象のDatatable変数.AsEnumerable().Where(Function(r)Cint(r("列名"))<条件).CopyToDataTable |
文字列フィルター | 保存先のDatatable変数=操作対象のDatatable変数.AsEnumerable().Where(Function(r)r("列名").ToString()="条件").CopyToDataTable |
複数条件の組み立て | 保存先のDatatable変数=操作対象のDatatable変数.AsEnumerable().Where(Function(r)Cint(r("列名"))<条件 AndAlso r("列名").ToString()="条件").CopyToDataTable |
iii.データテーブルをExcelに書き込む。
コードが長くて、理解しづらいところもあるため、少し説明いたします。
まず、AsEnumerableはLINQの中の拡張メソッドの一つです。LINQクエリはDataTable を直接処理できません。AsEnumerableを使用すると、DataTable を LINQ で処理できる型IEnumeable<DataRow>に変換できます。その後のWhereなどのLINQ操作が適用できるようにしているものと考えられます。
次に、Whereはのメソッドで、コレクション内の要素をフィルタリングするために使用されます。これにより、特定の条件を満たす要素だけが結果セットに含まれます。
さらに、r
はコレクション内の各行のデータを表します。ラムダ式では、r
はパラメータ名です。r("salary")
またはr.Item("salary")
を使用して現在の行の "salary" 列の値を取得し、r("Department")
を使用して "Department" 列の値を取得できます。
最後に、Cint( )とToString.( )は変数をそれぞれ数値と文字列に変換するメソッドです。
では、実例を見てみましょう。
例1、所属がITのデータを抽出します。
そうしたら、IT以外のデータが削除されました。
例2、所属がITで給料が20000以下のデータを抽出します。
結果は以下の通りです。
ちゃんと取りましたね。
6.最後に
以上でStudioにおけるフィルター処理の4つの方法をご紹介しました!Filter Data Table ActivityとExcel Filter Activityとも、コードの使用がほぼないため、初心者にとってともて使いやすい方法となります。一方で、フィルター操作を高速化し、複雑のフィルター条件でデータを絞りたい方は、ぜひSelectメソッドやLINQクエリを使ってみてください。
代入式の最後に、.CopyToDatatableが入っているのですが、それは③Selectメソッドで抽出した結果がDataRow型であるためです。.CopyToDatatableを削除するとしたら、代入アクティビティの左側の変数もDataRow型に変更しなければなりません。一方で、④LINQでDataTable.AsEnumerableに対してSelectを呼び出すと、その返り値の型はIEnumerable<DataRow>型となるので、.CopyToDatatableを削除するとしたら、代入アクティビティの左側の変数の型は、IEnumerable<DataRow>型とする必要があります。