Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

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

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

サンプルデータ

以下のようなユーザ情報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. ツールパレット基本フロー→「例外処理」を配置します。
    1. foreachからtry_catch startへプロセスフローを引きます。
    2. tryからmappingへプロセスフローを引きます。
    3. テーブル書き込みからtry_catch endへプロセスフローを引きます。
  2. 例外が発生しても処理を継続させたいので、ツールパレット基本フロー→「continue」を配置し、catchからプロセスフローを引きます。

処理の実行

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

エラーファイルをログに出力する

修正概要

先ほどの処理に例外が発生したファイル名をログに出力させる機能を追加します。

完成図

image
※赤枠が追加されたものです。

スクリプトの修正

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

処理の実行

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

ファイルの更新日付順でソートして処理を実行する

修正概要

ファイル名ではなくファイルの更新日付順に処理を実行できるようにします。

完成図

image
※赤枠が追加されたものです。

スクリプトの修正

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

処理の実行

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

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした