はじめに
この投稿は、RPAツール「UiPath」で Datatable で「行・列の挿入/削除」をする方法について、個人的にまとめたものです。
UiPathブログ発信チャレンジ の 20日目の記事です。
データテーブルの操作 シリーズ
DataTable の操作方法について記載した記事が、他にもあります。参考まで。
検証・動作環境/目次
この記事は、以下のバージョンをもとに作成しています。
- UiPath Studio:2022.4.3(Community版)
- UiPath.System.Activities:22.4.1
今回使用するアクティビティは、ここ数年はアップデートされていないので、上記より古いバージョンでも支障(機能差異)は無いと思います。
記事の内容は、以下の順で説明します。
- 1)行の追加と削除(UiPath 標準アクティビティで実施)
- 1-A)行の追加(「メソッドを呼び出し」&「.NETの機能」)
- 1-B)行の削除(「メソッドを呼び出し」&「.NETの機能」)
- 2)列の追加と削除(UiPath 標準アクティビティで実施)
- 2-A)列の追加(「メソッドを呼び出し」&「.NETの機能」)
- 2-B)列の削除(「メソッドを呼び出し」&「.NETの機能」)
前提)DataTableにおける、行と列の構造と概念
簡単に言うと、DataTableの行と列は、以下のように構成されています。
行は「index」、列は「ordinal」で順序が管理され、それぞれ「0(ゼロ)」から始まります。
順序を変更したり、間に挿入する場合には、この「index(通し番号の意)・ordinal(順序の意)」を意識する必要があります。
1)行の追加と削除(UiPath 標準アクティビティで実施)
UiPath 標準のアクティビティで「データ行を追加 (Add Data Row)」と「データ行を削除 (Remove Data Row)」があります。
見てわかるように、この2つは微妙に「見た目」「引数プロパティ」が少し違います。
アクティビティ名 | 違い |
---|---|
行追加 |
「配列型」でも行追加できる ようになっている |
行削除 |
「インデックス(位置)指定」でも削除できる ようになっている |
なので、「行追加の時は、位置を指定できない」
と思われがちですが、以降で紹介するように .NETの機能を使用すれば出来ます。
1-A)行の追加(「メソッドを呼び出し」&「.NETの機能」)
行の追加は、データテーブル標準のメソッド「.Rows.Add」または「.Rows.InsertAt」で出来ます。
「.Rows.Add」は最後尾に、「.Rows.InsertAt」は指定位置に行を追加します。
ケース | 使用するメソッド |
---|---|
行の「末尾」に追加したい場合 | dt.Rows.Add(行or配列オブジェクト) |
行の「先頭」に追加したい場合 | dt.Rows.InsertAt(行オブジェクト, 0) |
行の「2番目」に追加したい場合 | dt.Rows.InsertAt(行オブジェクト, 1) |
※ dt は データテーブルの変数を指します
Add の場合、行オブジェクトだけでなく、配列型でも追加できます。
InsertAt の第2引数には「行インデックス」を指定し、どの位置に挿入したいかを指定できます。
この行インデックスは「0始まり」なので、1行目に追加する場合は「0」を指定するのがポイントです。
また、例えば「特定の行の前に挿入したいが、その行の行インデックスが分からない」という場合は、
ケース | 使用するメソッド |
---|---|
その行の「インデックス値」を知りたい | dt.Rows.IndexOf(行オブジェクト) |
で、行インデックス値を取得できます。
この機能を使用すれば、ロジック上で自由に行の並びをコントロールできるようになります。
1-B)行の削除(「メソッドを呼び出し」&「.NETの機能」)
行の削除は、データテーブル標準のメソッド「.Rows.Remove」または「.Rows.RemoveAt」で出来ます。
ですが、「データ行を削除 (Remove Data Row)」と「できることは同じ」なので、あえて「.NET構文」を使わなくても良いでしょう。
InvokeCodeを使用して、ロジック上でスッキリ処理したい場合は、.NET構文のほうが便利だったりもしますが、この辺はお好みで。
ケース | 使用するメソッド |
---|---|
行を「オブジェクト指定」で削除したい場合 | dt.Rows.Remove(行オブジェクト) |
「先頭」の行を削除したい場合 | dt.Rows.RemoveAt(0) |
「2番目」の行を削除したい場合 | dt.Rows.RemoveAt(1) |
InsertAt のときと同じく、RemoveAt の第1引数には「行インデックス」を指定し、どの位置を削除したいかを指定します。
この行インデックスは「0始まり」なので、1行目を削除する場合は「0」を指定するのがポイントです。
2)列の追加と削除(UiPath 標準アクティビティで実施)
UiPath 標準のアクティビティで「データ列を追加 (Add Data Column)
」と「データ列を削除 (Remove Data Column)
」があります。
見てわかるように、この2つも微妙に「見た目」「引数プロパティ」が違います。
アクティビティ名 | 違い |
---|---|
列追加 |
追加時に「列名」を指定できる ようになっている |
列削除 |
「インデックス(位置)指定」でも削除できる ようになっている |
なので、列追加時は「位置を指定できない」
と思われがちですが、以降で紹介するように .NETの機能を使用すれば出来ます。
2-A)列の追加(「メソッドを呼び出し」&「.NETの機能」)
列の追加は、データテーブル標準のメソッド「.Columns.Add」で出来ます。(※1)
ケースNo | 処理の内容 | 使用するメソッド |
---|---|---|
1 | 価格列を追加したい | dt.Columns.Add("価格") |
2 | 価格列をInt型で追加したい | dt.Columns.Add("価格", Type.GetType("System.Int32")) |
残念ながら(行追加の「InsertAt」のように)「追加と順序指定」を同時に処理することは出来ません。
そのため、「列を追加」した後で「列の順番変更」の処理を行います。
ケースNo | 処理の内容 | 使用するメソッド |
---|---|---|
3 | 価格列を2番目にしたい | dt.Columns("価格").SetOrdinal(1) |
SetOrdinal で指定する値は「列インデックス」です。例のごとく「0始まり」なので、1列目に追加する場合は「0」を指定します。
※1 「dt.Columns.Add("SalesTax", typeof(Double), "Total * 0.086") 」のような「他列参照の値セット」の列作成方法もありますが、使用頻度は低いので割愛します。
また、例えば「特定の列の前に挿入したい」場合は、その列のインデックスを求めて、setOrdinal で指定すれば変更できます。
※ 追加した列に「各行の値」をセットする処理は、別途実施してください。
2-B)列の削除(「メソッドを呼び出し」&「.NETの機能」)
列の削除は、データテーブル標準のメソッド「.Columns.Remove」または「.Columns.RemoveAt」で出来ます。
ケースNo | 処理の内容 | 使用するメソッド |
---|---|---|
1 | 「価格」列を削除したい | dt.Columns.Remove("価格") |
2 | 「先頭」の列を削除したい | dt.Columns.RemoveAt(0)) |
3 | 「2番目」の列を削除したい | dt.Columns.RemoveAt(1)) |
RemoveAtで指定する値は列インデックスで、例のごとく「0(セロ)」始まりです。
行の削除と同じく、「データ列を削除 (Remove Data Column)」と「できることは同じ」なので、あえて「.NET構文」を使わなくても良いでしょう。
InvokeCodeを使用して、ロジック上でスッキリ処理したい場合は、.NET構文のほうが便利だったりもしますが、この辺はお好みで。
番外編)ループ内で追加・削除する場合の注意
行や列のループの中で「行・列の追加」や「行・列の削除」をすると、処理中にデータの順序が変わるため、エラーになったり想定外の処理結果になることがあります。
エラーを避けるためには、
- 「追加・削除」は別のループで行う
- 行や列の「後ろ」から処理していく(頭から実施すると、以降の順序が崩れる)
終わりに
以上、DataTableの「行・列」の挿入/削除方法について、でした。
標準アクティビティで事足りなければ「.NETの機能も使用してみる」と、要件を満たせることもあります。ちょっと使うくらいなら難しくありません。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。