一つのデータファイルを一括処理して、動的に複数ファイルへ書き出す方法

### 動的書き出し機能が必要なケース
「全店舗の売り上げデータをまとめて処理した後、各店舗に該当データを配布したい」といったケースで、「動的に複数のファイル（店舗毎）への書き出したい。」というご要望を頂くことがあります。そうしたケースにフィットする機能をご紹介したいと思います。

複数ファイルへの書き出しにはCDIの「ルーター」という変換部品を利用することが多いです。ただし、事前に書き出し先を決定する条件が判っていることが必要です。例えば、「10店舗分のデータを処理し１0ファイルに書き出す。」ことが判っていれば、ルーターに条件と、書き出し先ファイルを事前に設定すれば要件を実現できます。ただし、何店舗分のデータがデータセットに含まれるか事前に判らない場合、「ルーター」ではハンドリングが難しいです。データを処理する前に含まれる店舗コードを調べて、「ルーター」に設定することも可能ですが、このジョブが日次ジョブだった場合、毎日処理する前に含まれる店舗を調べて設定していては運用が大変ですし、設定ミスなどでジョブが想定外の結果に終わる事も考えられます。こういったことが無いように、動的なファイル書き出し機能を活用してください。

ちなみに「ルーター」とはフィールドの値によって、書き出し先を制御する変換部品です。

「ルーター」の条件設定画面
![Router_Condition.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/bcaf8428-4314-cfbb-1c2e-ab2aa355fc90.jpeg)

マッピングでの使用例
「ルーター」：フィールドの値によって、書き出し先を制御する変換部品
![CDI_Router_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/824e7734-7f80-7f76-a3a4-17736f0a0bc9.jpeg)

### 機能の設定方法
今回利用する部品は「フラットファイルコネクタ」と「トランザクション制御」です。
動的書き出しを行うためにマッピングを作成します。

まず、フラットファイルコネクタを使い、ターゲットの設定をします。ターゲットプロパティの「ターゲット」画面で、オブジェクトの「選択」をクリックします。![FF_Target_Choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/f85573ac-752f-9bac-0f3d-90c6404fa423.png)

ターゲットオブジェクト画面で「実行時に新規作成」を選択します。

![TargetObject00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/3df9e6cf-389b-939d-48df-88c9e4d2be65.png)

すると動的なターゲットの設定画面が開きます。
この画面で「動的ファイル名を使用」にチェックを入れます。

![DynamicFileNameChoise.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/45dcfcf2-f469-a3c5-b214-dd0dca9d13ed.png)

動的ファイル名の設定画面でフィールド名を利用して、動的ファイル名を設定します。
今回の例では、固定部分が"Output_Store_"と接尾辞の".csv"となります。

![GiveName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/71052d08-ec73-45a3-c476-56754e1dd648.png)

例えば、Store_IDの値が"S001"ならば、出力ファイル名は"Output_Store_S001.csv"となります。

### 機能の利用例
動的書き出し機能はフラットファイルコネクターの持つ機能です。今回ご紹介するケースでは、まず3店舗分のデータが混在するデータファイルを処理し、店舗別に3つのファイルに書き出します。その後、マッピングは変更せず、5店舗分のデータが混在するデータファイルを処理し、5つのファイルに分割書き出しする処理をご紹介したいと思います。以下に最初に処理対象となるデータファイルの内容を示します。

![SourceMixed_1st.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/f366aa2a-d26e-5556-92ee-3ee54cd25c95.png)
![DividedFileContents.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/e04e379f-4605-60d8-064a-0bc59615f2dc.png)



Store_IDがS001,S002,S003のいずれかの値を持つレコードが6行あります。このデータを2行ずつStore_ID毎に書き出します。使用するマッピングの全体像です。
![MO_Mapping01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/57e8f1ce-2f0f-bdb9-a34d-e1663a6e5312.png)

以下の二つポイントがあります。
1. 出力を分けるフィールドでソートを行うこと。
2. トランザクション制御変換部品で、トランザクション制御条件を「フィールド値が変わった場合」とし
    条件を判定するフィールドに出力を分けるフィールをと指定すること。

一つ目のポイントは、ソート変換部品でソート条件に該当フィールドを設定します。
![SortCondition01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/5216cbef-c84e-bca4-f4af-3dc05c9588af.png)

二つ目のポイントは、フィールド値が変わったらトランザクションをコミットすることです。
トランザクション制御条件を「フィールド値が変わった場合」に設定し、フィールドは書き出しを分けたい値を持つフィールドを設定します。「実行するアクション」には「次より前にコミット」を選択します。
![MO_TxControl_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/982d8563-6590-dfdd-b40b-883f78e3b9bb.png)

以下に、このマッピングを実行した結果を示します

![DividedFileContents.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/c53b7898-4440-d424-b778-7579a8ba544c.png)

StoreID毎に3つのファイルに分割書き出しされている様子が分かります。

次にStoreIDの値が、S001～S005の5種類を含むデータファイルを処理します。
ソースファイルに上記ファイルを設定するだけで、マッピングのほかの部分は変更しません。

実行結果ですが、5つのファイルに分割書き出しされています。

![Result_2nd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984401/19897720-1409-23cb-de3b-8edbb76ad33f.png)

以上、フラットファイルコネクターとトランザクション制御機能を組み合わせて、フィールドの値によって分割書き出しを行うマッピングを紹介してきました。この機能は、フラットファイルコネクターの機能ですので他のコネクタでは利用できないことにご注意ください。コネクタによっては、同様の機能があります(例：AWS
　S3コネクタ)。もし、ご紹介する機会があれば、是非投稿したいと思います。