複数のファイルからデータをロードする

#はじめに
同じフォーマットでファイル名が異なるデータをデータベースに登録する処理を作成してみます。
利用例としては日付がファイル名に含まれているような複数のログファイルがフォルダに格納されており、そのログファイルをまとめてデータベースへロードしたい場合です。

シンプルな処理に少しずつ機能を拡張してみようと思います。

#サンプルデータ
以下のようなユーザ情報10件が含まれたcsvファイルです。
今回使用するデータベースはcsvファイルと同一のスキーマを持つものを用意しています。

```01.csv
名前,ふりがな,アドレス,性別,年齢,誕生日,婚姻,都道府県,都道府県コード,携帯,キャリア
野崎 早織,のざき さおり,nozaki_saori@example.com,女,70,1943/8/15,既婚,千葉県,12,080-4644-8111,au
村瀬 優,むらせ ゆう,murase_yuu@example.com,女,44,1969/11/11,既婚,愛知県,23,080-3706-3979,ドコモ
高樹 薫,たかぎ かおる,takagi_kaoru@example.com,女,29,1985/3/28,既婚,北海道,01,090- 185-1891,ドコモ
矢田 豊,やだ ゆたか,yada_yutaka@example.com,男,58,1955/11/2,既婚,北海道,01,080-2818- 690,ドコモ
堀内 彩華,ほりうち あやか,horiuchi_ayaka@example.com,女,38,1976/2/9,既婚,東京都,13,080-7097-4305,ソフトバンク
塩谷 雅彦,しおや まさひこ,shioya_masahiko@example.com,男,28,1985/6/19,既婚,和歌山県,30,090-4614-8286,ドコモ
宮原 沙知絵,みやはら さちえ,miyahara_sachie@example.com,女,48,1965/5/18,既婚,北海道,01,090-1063- 628,ドコモ
塚原 美菜,つかはら みな,tsukahara_mina@example.com,女,65,1948/6/12,既婚,東京都,13,090-5619-3933,ソフトバンク
五大 愛菜,ごだい あいな,godai_aina@example.com,女,68,1945/4/18,既婚,福島県,07,090-6745-5176,ドコモ
藤山 茂樹,ふじやま しげき,fujiyama_shigeki@example.com,男,21,1992/8/31,未婚,福井県,18,080- 398-2212,ドコモ
```
#ひとつのファイルからデータベースにデータをロードする
一番シンプルな処理です。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/0bd80cea-cd88-b41e-fb7b-0bf4ce189781.png)

「ファイル読み込み」から「テーブル書き込み」をつなぐだけ。
ここに処理要件に合わせて修正していきます。

#複数ファイルをまとめてデータベースにデータをロードする
##修正概要
次に複数のファイルをまとめてデータベースの中にロードする処理に変更します。
##対象データ
以下のディレクトリに含まれた4つのファイルからデータをロードします。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/acf93281-eb6e-5cd8-44ed-481eb9b00a2b.png)

##完成図
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/c55b4df9-20fe-278e-1a74-f78897af2d2f.png)
※赤枠が追加されたものです。

##スクリプトの修正
1. スクリプト変数を作成します。
2. `ツールパレット`→`ファイル`→`ファイル操作`→「<b>`ファイル名一覧取得`</b>」を配置し、`Start`からプロセスフローを引きます。
3. `ツールパレット`→`基本`→`フロー`→「<b>`繰り返し（データ件数）`</b>」を配置し、`list`から右クリックでドラッグ&ドロップしてプロセスフローとデータフローを引きます。
4. `ツールパレット`→`変換`→`基本`→「<b>`マッピング`</b>」を配置し、`foreach`から右クリックでドラッグ&ドロップして`mapping`へプロセスフローとデータフローを引きます。
5. マッピング画面を開き、入力データの`name`から、スクリプト変数`filename`へ線を引きます。<br>
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/f6bdc267-cffa-4d73-11f3-3dfcf4cf6c31.png)
6. 読み込むファイル名を作成したスクリプト変数`filename`に変更します。<br>
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/2a61779e-71be-09c8-40cc-21acf1290ef5.png)
7. `テーブル書き込み処理`から`LOOP END`へプロセスフローを引いて完了です。

##処理の実行
デバッグ実行ボタンで実行して確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/bfac24be-682f-e118-562b-5b2d4525c344.png)
4ファイルのデータがすべて格納されていることを確認します。

#不正なデータファイルだけ処理を飛ばす
##修正概要
４つあるファイルのうち不正なデータの存在するファイルのみ処理を行わず、その他３ファイルのみ処理を継続します。
エラーのあったファイルの処理がロールバックされ登録されていないことを確認します。
##対象データ
`02.csv`ファイルに不正なデータを入れ、例外を発生させます。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/cb39ce3b-9f31-996f-b667-44bab3fbf6ad.png)

##完成図
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/11dd5cbd-e31c-9623-4b86-4ed91e7b44e5.png)
※赤枠が追加されたものです。

##スクリプトの修正
1. `ツールパレット`→`基本`→`フロー`→「<b>`例外処理`</b>」を配置します。
    2. `foreach`から`try_catch start`へプロセスフローを引きます。
    3. `try`から`mapping`へプロセスフローを引きます。
    4. `テーブル書き込み`から`try_catch end`へプロセスフローを引きます。
2. 例外が発生しても処理を継続させたいので、`ツールパレット`→`基本`→`フロー`→「<b>`continue`</b>」を配置し、`catch`からプロセスフローを引きます。

##処理の実行
先ほどと同じくデバッグ実行ボタンをクリックして実行させます。
テーブルブラウザを使ってテーブルの中身を確認すると02.csvのデータのみロードされていないことが確認できました。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/a4ec08ce-2003-1388-98bc-44786bb0ce1d.png)

#エラーファイルをログに出力する
##修正概要
先ほどの処理に例外が発生したファイル名をログに出力させる機能を追加します。
##完成図
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/a6a0be35-28df-9fbc-0628-debfe7b915dc.png)
※赤枠が追加されたものです。

##スクリプトの修正
1. アプリケーションログの設定をします。
    2. `Studio`→`コントロールパネル`→`アプリケーションログ出力設定`を開き、「<b>`新しいアプリケーションログ出力先の追加`</b>」をクリックします。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/be65ad6d-ec09-6542-e891-713c9b4c52dc.png)
    3. 今回はローテーションファイル形式にしてみるので、選択したらファイル出力先を指定します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/a212f848-06c7-6774-7224-2e6580c7c193.png)
1. `ツールパレット`→`基本`→`処理`→「<b>`ログ出力`</b>」を配置します。
    2. 先ほど作成したログ出力先を選択してメッセージを追加します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/3d89692e-c84e-163d-4842-f0ac28fa8441.png)<br>`コンポーネント名`、`ファイル名`、`エラーログ`の3つをパイプで区切って追加してみました。

##処理の実行
処理を実行し、ログファイルを確認してみます。
指定したディレクトリにログファイルが出力されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/2c31b548-f2f4-031a-6203-c89bae6b8a7f.png)
内容を確認します。
コンポーネント名、ファイル名が確認できました。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/af1dcaf7-0b51-4252-0c65-eaf9b426fd43.png)

#ファイルの更新日付順でソートして処理を実行する
##修正概要
ファイル名ではなくファイルの更新日付順に処理を実行できるようにします。
##完成図
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/0b41beac-89f9-bec0-7d1d-ba0cf0817b35.png)
※赤枠が追加されたものです。
##スクリプトの修正
1. マッピングを配置します。
    2. `ツールパレット`→`変換`→`基本`→「<b>`マッピング`</b>」を`list`と`foreach`の間に配置します。
2. ソートの設定を行います。
    3. 配置したマッピングをダブルクリックしてマッピング設定画面を開きます。
    4. `ツールパレット`→`繰り返し`→`基本`→`キーによるソート`を配置し、以下の図のように線を引きます。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/88057d31-05e9-1dad-9224-0f7f8c119ff8.png)
    5. 左右のスキーマが展開されていない場合は右クリックして`スキーマの読み込み（L）`をクリックします。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/b3d27729-cefe-9542-e964-688cde571f74.png)
    6. `コンポーネントから選択（C）`から`list`を選択してスキーマを展開します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/1c772b5d-c317-72d1-d234-b462ad97e48d.png)
    7. ソート順を変更する場合には`キーによるソート`コンポーネントを右クリックしてソート順を変更します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/f2b25f15-f462-f35e-66f4-32288f3ede6e.png)


##処理の実行
処理を実行し、実行ログを使って処理の順番を確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/af195bae-66c5-d960-95ac-38f065cc3078.png)



#最後に
その他、すべての処理をロールバックしたりさせたり、エラーが発生したファイルを指定のディレクトリに移動させたりと、処理要件によって様々な形に変更することができます。