【UiPath】CSVファイルを開く（Excel操作編）

# １．はじめに
　UiPathでCSVファイルを開く際に、「CSVを読み込み」をして、データテーブルにした後にExcelに転記するというような処理をしている人も多いかと思います。
　UiPathでもExcelアプリケーションによりCSVファイルを開くことができるため、その方法を紹介したいと思います。また、文字コードUTF-8の場合はそのまま処理すると以下のような文字化けが発生するので、対策も併せて紹介していきたいと思います。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/ffc79ed6-bf21-a719-b7fc-20d9bd170ccb.png)


# ２．環境情報
利用する環境は以下の通りとなります。
| ソフトウェア名 | バージョン情報 |
| :--- | :--- |
| OS | Windows10 |
| UiPath Studio | 22.10.5 |
| UiPathプロジェクトの対応OS | Windows |
| UiPath.System.Activities | 22.10.4 |
| UiPath.UIAutomation.Activities | 22.10.5 |
| UiPath.Excel.Activities | 2.16.2 |


# ３．ユースケース
　以下のようなCSVファイルが存在するケースを考えます。
### ◆ケース１（文字コード：Shift_JIS）
　ケース１では文字コードShift_JISで以下のようなファイルを考えます。
```data_Shift_JIS.csv
項目,価格,数量,金額
りんご,100,10,1000
"み""かん",20,100,2000
"もも","100","10","3,000"
```


### ◆ケース２（文字コード：UTF-8）
　ケース２では文字コードUTF-8で以下のようなファイルを考えます（ケース１と内容は同じです）。
```data_UTF-8.csv
項目,価格,数量,金額
りんご,100,10,1000
"み""かん",20,100,2000
"もも","100","10","3,000"
```
　

# ４．実装方法
### ◆ケース１（文字コード：Shift_JIS）
#### ＜実装例＞
　ケース１では以下のように「Excelファイルを使用」アクティビティを利用することで、処理することができます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/6c4ad0b9-87c0-bdfe-3061-a38215b9a235.png)

#### ＜主なポイント＞
##### ポイント①
　「Excelファイルを使用」アクティビティでCSVファイルを指定する場合、以下のようにファイルの種類を変更してください。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/792992e7-abe6-4947-7578-70d176a58488.png)

#### ＜処理結果＞
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/6b108bfc-1b93-0af5-273c-8c7a7db7890d.png)


### ◆ケース２（文字コード：UTF-8）
#### ＜実装例＞
　ケース２ではテキストファイル（文字コードUTF-8）として読みとった後、文字コードShift_JISでCSVファイルに書き込みをします。
　その後はケース１と同様に処理をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/afa6288c-6bda-59da-12c2-2cbc393b1c0d.png)

#### ＜主なポイント＞
##### ポイント①
　Windows対応のプロジェクトの場合Shift_JISが標準文字コードとなっていないため、文字コードShift_JISを利用する前に「メソッドを呼び出し」アクティビティで以下のような処理をする必要があります。同コードを実行することにより、Windowsデスクトップの.NET Frameworkに存在するが、.NETでは存在しないエンコードを取得し、利用可能なエンコードとして登録することできます。そのため、Shift_JIS文字コードを利用する予定がある場合は、ワークフローの先頭で同コードを呼び出すことをお勧めいたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/83e61bc2-e514-c3ae-eeeb-19d9d189e624.png)

| 項目 | 設定値 |
| :--- | :--- |
| TargetType | System.Text.Encoding |
| TargetObject | 指定なし |
| MethodName | RegisterProvider |
| コレクションパラメーター | Direction:入力<br>Type：System.Text.EncodingProvider<br>Value：System.Text.CodePagesEncodingProvider.Instance |

:::note info
情報
Windowsプロジェクトで利用している.NET で使用できる標準の文字エンコーディングは、ASCII、UTF-7、UTF-8、UTF-16、UTF-32となっています。
また、Windowsレガシプロジェクトでは.Net Frameworkを利用しているため、本対応は不要となります。
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/character-encoding
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.registerprovider?view=net-6.0
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.codepagesencodingprovider?view=net-6.0
:::
##### ポイント②
　「テキスト ファイルを読み込み」アクティビティにより、UTF-8でテキスト情報を取得します。
　プロパティのエンコードに「UTF-8」を指定します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/aabb5120-9ea0-685d-77fe-ca9db24790a2.png)

##### ポイント③
　「テキスト ファイルに書き込み」アクティビティにより、Shift_JISでテキスト情報を書き込みます。
　プロパティのエンコードに「Shift_JIS」を指定します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/040cac19-126f-a747-fb52-6c9d125d9907.png)

:::note warn
警告
**メモリ上に情報が保持されるので、CSVファイルの容量が大きい場合**は注意してご利用ください
:::

#### ＜処理結果＞
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/6b108bfc-1b93-0af5-273c-8c7a7db7890d.png)

# ５．さいごに
　CSVの定義は公式的な仕様はありませんが、2005年10月、RFC 4180 で Informational（IESGの外部で決定された有用な情報の提供）として仕様が成文化されていますので、ファイルを作成する際には参考にして頂ければと思います。
### ◆主なポイント
* 各レコードは、改行(CRLF)を区切りとする
* 最終レコードの終端は、改行(CRLF)が存在してもしなくてもよい
* ファイルの先頭は、通常行と同一の書式を持つ、ヘッダ行が存在してもしなくてもよい
* 各フィールドは、それぞれダブルクォーテーションで囲んでも囲わなくてもよい
ただし、ダブルクォーテーションで囲まれていないフィールドには、ダブルクォーテーションを含めることができない
* 改行(CRLF)、ダブルクォーテーション、コンマを含むフィールドは、ダブルクォーテーションで囲むべきである
* ダブルクォーテーションは、1つ前にダブルクォーテーションを付加し、エスケープしなければならない

:::note info
参考情報
https://datatracker.ietf.org/doc/pdf/rfc4180.pdf
:::