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を呼ぶだけです。
パラメータは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を指定します。
区切り文字をタブに変更
CSVではなく、TSVを出す方法は以下の通り。
FieldDelimiterに区切り文字として使用したい文字(タブ文字)を指定してください。
Chrは、文字コードを指定して対応する文字を返す組み込み関数。
出力するAttributeを選別する
AttrFilterプロパティに指定します。
出力したいAttributeのNameプロパティの値を「,」で区切って結合したものを設定すればよいようです。
CSVファイルをインポートする方法
基本の方法
バイナリ形式のCSVファイルを受け取ってRecordのListに変換するには、LoadCSV2RecordList Actionを使います。
Configパラメータはこちらにもあります。しかし、「CSVファイルをエクスポートする方法」でConfig指定なしで出力したCSVであれば、Config指定なしでインポートできました。
読み込んだ結果は、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
1レコード目のId=9110, FinancialAssetRecordId=4, Code=1478...
のようにマッピングされました。
(CSVのヘッダ行の列名を変更しても、読み込んだ結果は変わらなかったので、順番だけで判定していそうです)
UTF-8以外の文字エンコーディングのファイルを読み込む
Shift-JISでエンコーディングされているファイルを読み込むための設定。
文字エンコーディングの指定先はConfigパラメータのEncodeプロパティ。指定可能な文字エンコーディングはCSVUtilのドキュメントにリンクされているEncoding Classにリストがあります。