[OutSystems] CSVファイルからデータを読み込み変数に格納する※forge未使用

## はじめに
株式会社メディアテック所属の @mt-h2 です。
普段は OutSystems を利用したローコードでシステム開発を行っています。

今回はForgeを使わずCSVファイルのデータをテキストとして配列に格納する手段を記載します。
※ 後々この方法を使って、テスト用の Entity レコード生成を楽に管理する所までを記事にする予定です

:::note info
対象バージョンは OutSystems 11 となります。
:::

## 前提
データ読み込みに使用する csv ファイルは以下を前提としています。
- Excel で作成
- 保存オプションが以下である
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/516c76c8-0011-7f0e-dd9d-3fda0cd14607.png)
- csv ファイル内容が以下である
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/555daa9c-0ee1-50f7-c2b5-64aea354b907.png)

## 実装
前提の csv を使用してデータ読み込みを実装していきます。

### csv ファイルを配置
まずは前提で作成した csv ファイルをソリューションに配置します。

「Resources」ディレクトリを右クリックして「Import Resource」を選択してアップロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/0211b2fe-ffa1-2a92-87e5-ffc6a97885cb.png)

アップロードすると「Resources」ディレクトリ下に csv ファイルが配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/03f76dda-a1e6-8ee3-fb0b-a1581be2f4ca.png)

### データ格納用の構造体を作成
次に csv ファイルの各セル値を格納するための構造体を作成します。
今回は以下カラム値を格納します。
- rows（行番号）
- name（氏名）
- age（年齢）

これらを格納する為、以下 Attribute を持つ Structure を作成してください。
- rows： Integer
- name： Text
- age： Integer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/7f19652e-9f1b-46e0-ddf4-500495d90ea2.png)

### サーバアクション作成
データ読み込みサーバアクション用の準備が完了したので、サーバアクションの実装に入ります。
任意の名前でサーバアクションを作成してください。

#### csv ファイル読み込み
まずは csv ファイルを読み込みます。
1. csv ファイルを格納するバイナリデータ型変数をサーバアクションに作成
1. 「Assing」ウィジェットを配置し、「Resources」ディレクトリに配置 csv ファイルを「1.」で作成した変数に代入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/28deef66-9255-cab1-4558-6255e638305d.png)
1. csv ファイルのテキストを格納するテキスト型変数をサーバアクションに作成
1. csv ファイルのバイナリデータを代入した変数を、「[BinaryDataToText](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_apis/binarydata_api/#BinaryDataToText)」組み込みアクションでテキスト形式に変換したものを、「3.」で作成した変数に代入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/17468806-b847-c351-6a81-821306240e9d.png)
※ UTF-8 でエンコード指定していますが、環境によって「unicode、utf-8、utf-16、ascii」に置換してください

#### csv データを変数に格納
ここまで来たら後はテキストデータを解析して配列に格納していくだけになります。
1. サーバアクションに、データ格納用の構造体の配列を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/7c835712-3d88-3f64-5eba-8bd017f19ec6.png)
1. [String_Split](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_apis/text_api/#String_Split) サーバアクションでテキストを1行ごとに配列へ変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/4713ce5a-06ef-eebb-a9c1-2f9ddc1812c8.png)
・Text の Replace では、改行コードを CRLF から LF にしています。これが無い場合、String_Split で不要な空行が追加されます。
・Delimiters が "" となっていますが、この指定により改行コードが対象となります。
・String_Split が存在しない場合は、「Manage Dependencies」から追加してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/a7c9f2d7-54bf-56df-0e2f-e8ecbd91cc44.png)
1. 「For Each」ウィジェットを配置し、String_Split の戻り値をループ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/55568d82-e63f-f8dc-8f61-ff1ea1b42500.png)
・1行目はカラム名なので 「Start Index」は 1 始まりにしています
1. 「For Each」内の先頭に「If」ウィジェットを配置し、値が空であれば Continue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/d998ac2b-7516-964a-baa4-d42a251128c5.png)
・前提の手順で作成した csv ファイルは、最終行が改行されているためです
1. String_Split サーバアクションを配置し、カレントループテキストを「,」で分割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/f3f8cf8b-d941-8027-d3ed-194e303bc4b3.png)
1. 「ListAppend」ウィジェットを配置し、「1.」で作成した配列に値を格納
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/83054418-a93b-dc4f-4d6c-2b8bc50c0d13.png)

### 完成
これで csv ファイルを変数に格納する実装が完成しました。
最終的に以下のような形となっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/607102d6-95b8-43fe-4e8f-b1387fac9e0c.png)

では実際に実行してみます。
ブレークポイントを貼って戻り値を確認すると、以下のように csv ファイルの内容が格納されている事が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/33406acb-15b4-215f-0ae0-9e62f097d063.png)

## あとがき
今回は、自動テスト用のデータセットアップを1つ1つ作るのが面倒だから csv で管理したいなぁ。というところから始まり、まず最初の一歩である csv ファイルの内容を処理できるよう読み込むところまで作成してみました。
次はこの csv ファイルの内容でデータセットアップする方法までを記事にしたいと思います。

## さいごに
株式会社メディアテックでは絶賛 [開発メンバを募集中](https://www.mediatech.jp/recruit) です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。