2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-18

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

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

#サンプルデータ
以下のようなユーザ情報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

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

#複数ファイルをまとめてデータベースにデータをロードする
##修正概要
次に複数のファイルをまとめてデータベースの中にロードする処理に変更します。
##対象データ
以下のディレクトリに含まれた4つのファイルからデータをロードします。
image

##完成図
image
※赤枠が追加されたものです。

##スクリプトの修正

  1. スクリプト変数を作成します。
  2. ツールパレットファイルファイル操作→「ファイル名一覧取得」を配置し、Startからプロセスフローを引きます。
  3. ツールパレット基本フロー→「繰り返し(データ件数)」を配置し、listから右クリックでドラッグ&ドロップしてプロセスフローとデータフローを引きます。
  4. ツールパレット変換基本→「マッピング」を配置し、foreachから右クリックでドラッグ&ドロップしてmappingへプロセスフローとデータフローを引きます。
  5. マッピング画面を開き、入力データのnameから、スクリプト変数filenameへ線を引きます。

    image
  6. 読み込むファイル名を作成したスクリプト変数filenameに変更します。

    image
  7. テーブル書き込み処理からLOOP ENDへプロセスフローを引いて完了です。

##処理の実行
デバッグ実行ボタンで実行して確認します。
image
4ファイルのデータがすべて格納されていることを確認します。

#不正なデータファイルだけ処理を飛ばす
##修正概要
4つあるファイルのうち不正なデータの存在するファイルのみ処理を行わず、その他3ファイルのみ処理を継続します。
エラーのあったファイルの処理がロールバックされ登録されていないことを確認します。
##対象データ
02.csvファイルに不正なデータを入れ、例外を発生させます。
image

##完成図
image
※赤枠が追加されたものです。

##スクリプトの修正

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

##処理の実行
先ほどと同じくデバッグ実行ボタンをクリックして実行させます。
テーブルブラウザを使ってテーブルの中身を確認すると02.csvのデータのみロードされていないことが確認できました。
image

#エラーファイルをログに出力する
##修正概要
先ほどの処理に例外が発生したファイル名をログに出力させる機能を追加します。
##完成図
image
※赤枠が追加されたものです。

##スクリプトの修正

  1. アプリケーションログの設定をします。
    2. Studioコントロールパネルアプリケーションログ出力設定を開き、「新しいアプリケーションログ出力先の追加」をクリックします。
    image
    3. 今回はローテーションファイル形式にしてみるので、選択したらファイル出力先を指定します。
    image
  2. ツールパレット基本処理→「ログ出力」を配置します。
    2. 先ほど作成したログ出力先を選択してメッセージを追加します。
    image
    コンポーネント名ファイル名エラーログの3つをパイプで区切って追加してみました。

##処理の実行
処理を実行し、ログファイルを確認してみます。
指定したディレクトリにログファイルが出力されています。
image
内容を確認します。
コンポーネント名、ファイル名が確認できました。
image

#ファイルの更新日付順でソートして処理を実行する
##修正概要
ファイル名ではなくファイルの更新日付順に処理を実行できるようにします。
##完成図
image
※赤枠が追加されたものです。
##スクリプトの修正

  1. マッピングを配置します。
    2. ツールパレット変換基本→「マッピング」をlistforeachの間に配置します。
  2. ソートの設定を行います。
    3. 配置したマッピングをダブルクリックしてマッピング設定画面を開きます。
    4. ツールパレット繰り返し基本キーによるソートを配置し、以下の図のように線を引きます。
    image
    5. 左右のスキーマが展開されていない場合は右クリックしてスキーマの読み込み(L)をクリックします。
    image
    6. コンポーネントから選択(C)からlistを選択してスキーマを展開します。
    image
    7. ソート順を変更する場合にはキーによるソートコンポーネントを右クリックしてソート順を変更します。
    image

##処理の実行
処理を実行し、実行ログを使って処理の順番を確認します。
image

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?