[OutSystems]CSVを扱うForgeコンポーネント（CSVUtil）

ListとCSVファイルを相互に変換するActionを提供するForgeコンポーネントの動作を確認してみました。

# 確認環境
Personal Environment(Version 11.13.0 (Build 31107))
Service Studio (Version 11.12.0)
CSVUtil (Version 1.11.6)

# CSVファイルをエクスポートする方法
## 基本の方法
RecordのListをText型のCSVに変換する方法。

基本的には、CSVUtilExtensionに含まれる、ExportRecordList2CSV Actionを呼ぶだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/8ddd6fe2-a0c5-812a-21b3-c42da0ec9877.png)

パラメータは2つ。RecordListはObject型。Object型はToObjectにRecordのListを指定することで取得できます。Configには変換設定を指定しますが、とりあえず空白で大丈夫です。

なお、Object型が要るので、ExportRecordList2CSV Action呼び出しはServer Actionで行う必要があります。Client Actionでは、Objectパラメータを要するServer Actionを呼べないため。

## Config
Configパラメータの型はCSVExportConfig Structureで、以下のAttributeを持っています。

- IsShowHeader: ヘッダ行を出力するか (デフォルトでは出力する).
- FieldDelimiter: 行内の各要素の区切り文字 (デフォルトは「,」カンマ)
- EncodeMode: 特殊な文字をエスケープする方法を指定（デフォルトはautoで必要なときのみ）
- Line Separator: 行の区切り文字 (デフォルトはCRLFでWindowsの改行文字ですね
- CustomHeader: ヘッダ行を任意指定する
- AttrFilter: 出力するAttributeを指定する (例: EmployeeName,EmployeeFurigana)

## DebugInfo
出力パラメータにはDebugInfoというものもありますが、名前どおりデバッグ用の参考情報を出してくれるようです。
戻ってきた結果を確認すると、渡したパラメータの.NETでの型名が返ってきました。
以下はサンプル（Aggregateで取得したEntityのListを渡した場合）。

```
RecordList:RLFinancialAssetRecordDetailRecordList
Record:RCFinancialAssetRecordDetailRecord
RecordStruct:ssENFinancialAssetRecordDetail/ FinancialAssetRecordDetail(Type=ENFinancialAssetRecordDetailEntityRecord)
  Field:_ssId / Id (Type=Int64)
  Field:_ssFinancialAssetRecordId / FinancialAssetRecordId (Type=Int64)
  Field:_ssCode / Code (Type=String)
  Field:_ssName / Name (Type=String)
  Field:_ssNumber / Number (Type=Int32)
  Field:_ssCurrentPrice / CurrentPrice (Type=Decimal)
  Field:_ssAccountTypeId / AccountTypeId (Type=Int32)
```

Recordの属性についても返してくれるようですね。
フォーマットは「Field: .NETでの属性名 / OutSystemsでの属性名（Type=.NETでの型)」。

## 日本語ヘッダーを出すには、CustomHeaderを指定する
標準的には、ヘッダー行にはRecord各AttributeのNameプロパティの値が出力されているようです。
つまりこのままでは日本語が出力されない。

日本語名をヘッダー行に出力したいときは、以下のようにCustomHeaderを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a7a833da-4c1a-bbeb-b500-af239add5a65.png)

## 区切り文字をタブに変更
CSVではなく、TSVを出す方法は以下の通り。
FieldDelimiterに区切り文字として使用したい文字（タブ文字）を指定してください。
Chrは、文字コードを指定して対応する文字を返す組み込み関数。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/4892d809-72b5-9ce8-5924-b74a794f694b.png)

## 出力するAttributeを選別する
AttrFilterプロパティに指定します。
出力したいAttributeのNameプロパティの値を「,」で区切って結合したものを設定すればよいようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/465ce361-ac65-2790-fd37-d079177bcc03.png)

# CSVファイルをインポートする方法
## 基本の方法
バイナリ形式のCSVファイルを受け取ってRecordのListに変換するには、LoadCSV2RecordList Actionを使います。
Configパラメータはこちらにもあります。しかし、「CSVファイルをエクスポートする方法」でConfig指定なしで出力したCSVであれば、Config指定なしでインポートできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6b5ed40c-89a8-915a-a859-8b37c4bd6dd8.png)

読み込んだ結果は、Input ParameterのRecordListで渡したListに追加してくれます。

## Config
ConfigパラメータはCSVLoadConfig Structureで、以下のAttributeを持っています。

- Encode: CSVで渡したバイナリファイルの文字エンコーディング (デフォルトはutf-8。選択できる値は.NET FrameworkのEncoding Classで使用可能な値から)
- IsSkipHeader: 最初の行をスキップするか否か (デフォルトはスキップ。ヘッダ行があるとき用の指定ですね)
- IsIgnoreColumnChange: フィールド数が違うときにエラーを発生させるか否か (デフォルトは発生させる)……ということだが、ソースを追ってもdllの内部に隠蔽されていて用途がいまいちわからない
- FieldDelimiter: 行内の各要素の区切り文字 (デフォルトは「,」カンマ)
- IsDisableDoubleQuote: CSV各セルのダブルクォートエスケープを無効化する(デフォルトはTrue)。これもソースを追っても詳細がわからない
- AttrFilter: 読み込むAttributeを指定する (例: EmployeeName,EmployeeFurigana)
- IsDropCommentRow: #で始まる行をコメント行としてスキップする (デフォルトはスキップ)

## 列と属性のマッピング
ヘッダ行の列名は関係ないようです。
CSVファイル内での列位置と、Structure内でのAttribute位置が対応している。

例：
以下のようなCSVを渡して

```
Id,FinancialAssetRecordId,Code,Name,Number,CurrentPrice,AccountTypeId
9110,4,1478,iSMSCI高配当,50,2255.00000000,1
9111,4,1566,上場EM債,4,44200.00000000,1
```

以下のEntity型のListを利用する場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6f0e3c4d-60a5-cf9d-42c4-0de5246f01b5.png)

1レコード目のId=9110, FinancialAssetRecordId=4, Code=1478...
のようにマッピングされました。
（CSVのヘッダ行の列名を変更しても、読み込んだ結果は変わらなかったので、順番だけで判定していそうです）

## UTF-8以外の文字エンコーディングのファイルを読み込む
Shift-JISでエンコーディングされているファイルを読み込むための設定。
文字エンコーディングの指定先はConfigパラメータのEncodeプロパティ。指定可能な文字エンコーディングはCSVUtilのドキュメントにリンクされている[Encoding Class](https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding?view=netframework-4.8#list-of-encodings)にリストがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a9b37259-048c-7864-c530-2d554cffebbc.png)