【随時更新】Document Understanding のデータ出力操作のメモ

# はじめに

- 本記事は、UiPath Studio の基礎知識をお持ちで、これから Document Understanding を利用したい方向けの内容となっています。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.4 バージョンで構成しています。
- Automation Cloud のアカウントおよび Pro Trial を申請するなどして DU のアクセス権限を取得している必要があります。

# Document Understanding のデータ出力操作のメモ

探し方がよくなかったのか、***Document Understanding のエクスポートで得られる出力（DataSet（データセット）型）（※補足）*** に関する記事がみつからなかったのでメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3d0cbed3-accc-30d8-17f7-21db29ff2341.png)
DataSet型はデータベースの様なもので、Document Understanding にみる
読み取り結果が1種類の表（テーブル）におさまらないケースでよく使われます。

※補足：以下がDUの抽出結果をエクスポートするアクティビティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/2a7783ad-7a5a-8986-f545-7d7a58ca87ec.png)

## Document Understanding のテンプレートにある標準の出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3b2ce6b1-6792-4887-3111-bd3fcbfccc21.png)
1. 「繰り返し（コレクションの各要素）」を配置、{DataSet}.Tables を各要素に、
TypeArgument に DataTable を指定します。
1. 「範囲に書き込み（ワークブック）」を配置し、出力ファイルパス・シート名・内容（明細レコード）を指定します。

これによって、次の様な出力結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/eb29a697-1d5c-8611-0437-7084b5f3dbd6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b0c144ff-1873-f9df-b812-930f1705761b.png)

::: note
***読み取った文書の単位でEXCEL等に情報出力できればよいケース*** に適応します。
なお、「データ テーブルを出力」や「CSV」アクティビティをもちいることでテキストやCSV出力も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/47f95264-7426-f153-535d-aac8f2cdd7fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/9b86d4b9-cc72-6b8d-ded0-41d4641b14f4.png)

※DU でエクスポートしたデータセットの構成例：
（「Simple Fields（表）」であれば抽出結果のデータセット.Tables(0)で取得できます。
- Simple Fields（表）
- Simple Fields - Formatted（表）
- タクソノミーで設定した表
- タクソノミーで設定した表 - Formatted
:::

## 特定項目の値を取得したい、項目を絞って出力したい

読み取ったデータから取得する項目、出力項目を絞りたい場合にも、
```
抽出結果のデータセット.Tables(0).Rows(0).item("部署名").ToString+","+抽出結果のデータセット.Tables(0).Rows(0).item("お名前").ToString+","+抽出結果のデータセット.Tables(0).Rows(0).item("自由記述欄").ToString
```
の様に、{DataSet}.Tables(インデックス) でテーブル化できるため、普段のテーブル操作と同じ様に値取得が可能です。

```
// 値加工のサンプル：
// 半角スペースを除去（単純な文字列置換）
{左辺の整形済みテキスト} = 抽出結果のデータセット.Tables(0).Rows(0).item("自由記述欄").ToString.Replace(" ","")

// 電話番号からハイフンを除去（正規表現をもちいた置換）（例）080-1234-5555　→　08012345555
{左辺の整形済みテキスト} = System.Text.RegularExpressions.Regex.Replace(抽出結果のデータセット.Tables(0).Rows(0).item("電話番号").ToString, "[^0-9]", "")

// 日付のフォーマットを変更（正規表現をもちいた置換）（例）2023/06/14　→　2023年6月14日
System.Text.RegularExpressions.Regex.Replace(抽出結果のデータセット.Tables(0).Rows(0).item("入力日付").ToString,"(?<year>(?:\d\d)?\d\d)/(?<month>\d\d?)/(?<day>\d\d?)","${year}年${month}月${day}日")
```

## 読み取ったレコードを1つの表に纏めたい

本メモ記事を書く動機となったケースです。
***新たなテーブルを1個つくって、そこにレコード追加をしていきたい場合*** の実装メモです。

まず、「データ テーブルを構築」で新しいテーブルのインスタンスを生成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/de243d24-9c28-6070-0a92-f6befb0ac1e2.png)
繰り返し処理の中に「データ行を追加」アクティビティを配置し、{DataSet}.Tables(インデックス).Rows(インデックス)***.ItemArray*** と記述し列配列を指定します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/5f420ea4-8f69-59ad-84ff-09eebcf140c5.png)
（tmpTable の出力例）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/63ba5a0a-2beb-b588-1026-42f3510d57a4.png)

::: note warn
詳しくないので解説はできませんが、「抽出結果のデータセット.Tables(0).Select.First」の様に記述し DataRow をつくって行追加（.Add）しようとしても、***既に他のテーブルに所属しています***、とエラーになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/55fa1d6b-8eaa-f089-eb16-eeae1ed6f5dd.png)
:::

# おわりに

いかがでしたでしょうか？
Document Understanding の機能はワークフローの一部であり、読み取った後のデータ操作が肝となるのですが、
DataSet型扱ったことがない方にとっては？がつきやすい部分かとおもい記事にしました。
この記事を読んで少しでもDUの理解が深まった、また関心が強まったという方は
是非以下の記事等もご覧になっていただけますと幸いです。

https://qiita.com/Kajiita/items/552a1192ab457281bfb3

https://qiita.com/Kajiita/items/0dd8d410b572e076dcfe

https://qiita.com/Kajiita/items/dd99eb753813d31fbe6a

https://qiita.com/Kajiita/items/e9cacc4313026efc2f12