目次:
第2章 CSVデータ取り込み
2.1 フロー「CSVデータ取り込みパターン1」
2.2 フロー「CSVデータ取り込みパターン2」
補足
サンプルプロジェクトはここからダウンロード
PDF資料ダウンロードはこちら
第2章 CSVデータ取り込み
2.1 フロー「CSVデータ取り込みパターン1」
・郵便番号データCSVファイルを元に、郵便番号マスタテーブルにデータを挿入する処理のフロー
・郵便番号データCSVファイルのデータ件数はとても多い(12万件超)
・CSVファイル(12万件超)のファイルをそのまま使用してデータ挿入処理を行うフローについて解説する
前提:
・DBMS:Microsoft SQL Serverを利用している
・CreateTable文のファイルは用意済
・先に[zipcloud]データベースを作成しておく必要がある
Micosoft SQL Management Studioを使用して、
[zipcloud]データベースを作成する(補足資料b)参照)
2.1.1 フロー「CSVデータ取り込みパターン1」リソース
・設定画面のリソース「Database_zipcloud」
①:DBMSの種類をコンボボックスから選択
このプロジェクトではデータベース「zipcloud」のDBMSである「Microsoft SQL Server」を選択
②:データベース名を設定
環境変数を使用する場合は、値欄の右端の[...]ボタン(Ⓐ)をクリックして表示される環境変数のリストから選択すると、環境変数名の前後に「%」で括られた文字列が値欄にセットされる
③:データベースサーバ名を設定
④:データベースに接続するユーザを設定
⑤:データベースに接続するユーザのパスワードを設定(※補足c)に注意点の説明あり)
2.1.1 フロー「CSVデータ取り込みパターン1」フロー図
トリガー:Directory Scanner(詳細は以降のページにて解説)
ステップ①:「データマッパー」アダプタ
Directory Scannerトリガーのフィルタ条件に設定しているflgファイルに含まれる郵便番号データの更新日を取得する
ステップ②:「Flow Data」アダプタ
Flgファイルを検出して取得した送り元/送り先ファイルパスの拡張子「flg」を「csv」に置換して、郵便番号データCSVファイルパス(移動元/移動先)を変数にセットする
ステップ③:「データマッパー」アダプタ
郵便番号CSVデータファイル⇒郵便番号マスタテーブルにデータを取り込む処理
続いてフローのプロパティの解説をする
フローのプロパティ
最大インスタンス数:1
最大インスタンス数は、同時並行実行可能なインスタンス数(スレッド数)を指定することが出来るパラメータ
これを「1」に設定することで、同時並行実行可能なスレッド数の上限が1となり、複数並行実行出来ないよう、制限を掛けることが出来る。
つまり、「1」を設定することで、このフローは一つしか実行出来なくなる。トリガー条件を満たす状態が同時並行で発生しても、1つだけが実行され、その処理が終了またはアボートした後に実行される
2.1.2 フロー「CSVデータ取り込みパターン1」のトリガー
トリガーについて(Directory Scanner)
監視フォルダパス: EnvVal ('currentprojectdir') & 'Input_YubinCSV\Pattern1’
移動先フォルダパス: EnvVal ('currentprojectdir') & 'Input_YubinCSV\Pattern1\done’
フィルタ:x-ken-all*.flg
※補足
x-ken-all.csvファイルの件数が多くファイルサイズが大きいことから、ファイルの移動に時間を要することを考慮して、フィルタでは拡張子「flg」ファイル(ファイルサイズが小さい数バイト)を検出するようにして工夫している
x-ken-all*.csvファイルの監視フォルダへのコピーあるいは移動が完了した後に、フィルタ条件のx-ken-all*.flgファイル(サイズが小さいファイル)を移動させることで、サイズの大きいファイルのコピーあるいは移動の途中でファイルが検知されてしまうことにより「Move」アクションがエラーとなる(ファイルロックにより移動が失敗する)ことを防止するための策である。
これはファイルの処理順序と、サイズが小さいファイルのコピーあるいは移動には時間が掛からないので、サイズが小さいファイルを検出するよう、フィルタ条件を指定している工夫がポイントとなる。
Directory Scannerトリガー-[ログと戻値詳細]ボタンをクリックして表示される設定画面
設定内容は下記の通り
2.1.3 「郵便番号データファイル名セット」ステップ
①「郵便番号データファイル名セット」ステップは、Flow Dataアダプタステップ
このステップでは、Directory Scannerトリガーで検出したファイルパスおよび、移動先のファイルパスの拡張子「flg」を「csv」に置換している
2.1.4 「ファイル移動」ステップ
②「ファイル移動」ステップは、ファイル管理アダプタのステップ
郵便番号データCSVファイルを移動する
①のステップ「郵便番号データファイル名セット」で郵便番号CSVデータファイルのパス(移動前・移動先)をセットした変数を利用してファイルを移動する
ファイル管理アダプタでは、ファイルの移動は「Rename File」メソッドを利用することで実現できる
②「ファイル移動」ステップはファイル管理アダプタを利用している
設定画面
2.1.5 「データマッパー」ステップ
③「データマッパー」ステップにて、CSV→郵便番号マスタテーブルへの挿入処理
③「データマッパー」ステップにて、CSV→郵便番号マスタテーブルへの挿入処理
「データマッパー」ステップの設定:
送り先:FlatFileのプロパティ
③「データマッパー」ステップにて、CSV→郵便番号マスタテーブルへの挿入処理
「データマッパー」ステップの設定:
送り元:FlatFileのプロパティ
2.1.6 「NOP」アダプタステップ(Tips)
フローの最後の「NOP」アダプタステップは、デバッグ時のブレイクポイントを設定するために設けている
デバッグ実行時に、フローを最後まで実行させてしまうと、もう一度フローを実行し直ための操作が必要となるので、最後のステップに「NOP」を配置してブレイクポイントを設定しておくことで、そこでブレイクされる(一時停止される)ので、コンテキストビューアを表示して、各種変数の現在値を確認することが出来るようになる、ちょっとしたTips(便利な使い方)である
「NOP」アダプタステップは「No OPeration」の略。このステップ自体は何も処理をしない
なお、このステップ実行後、C.Sys.ErrorCodeは「0」がセットされる(常に正常終了)
「NOP」アダプタはフローの先頭で分岐したい場合にも活用することが出来る(分岐のルートステップ)
ちなみにブレイクポイントはデバッグ実行時に機能し、そのステップの(実行)条件を満たすと実行する前に一時停止される
2.2フロー「CSVデータ取り込みパターン2」
2.1のフロー「CSVデータ取り込みパターン1」は、件数が多いCSVデータファイルひとつで取込処理を実行するフローでした
この場合、取込処理に時間を要するのは自明である
ここでは、CSVデータファイルを4つに分割してデータ取り込み処理を4つ同時並行実行させることで、取込処理全体に要する時間軽減が期待できる
全体フロー図
2.2.2 フロー「CSVデータ取り込みパターン2」フロー図 トリガー
トリガーについて(Directory Scanner)
監視フォルダパス: EnvVal ('currentprojectdir') & 'Input_YubinCSV\Pattern2’
移動先フォルダパス: EnvVal ('currentprojectdir') & 'Input_YubinCSV\Pattern2\done’
フィルタ:x-ken-all*.flg
2.2.3 フロー「CSVデータ取り込みパターン2」フロー図その1
2.2.4 フロー「CSVデータ取り込みパターン2」フロー図その2
CSVデータ取り込み 並行実行処理の部分
2.2.5 フロー「CSVデータ取り込みパターン2」フロー図その3
ファイル分割ステップ以下のリトライ処理の箇所
2.2.6 「ファイル分割」ステップ④(フロー図その1のステップ④)
郵便番号CSVデータファイルの件数が12万超あるため、4つのファイルに分割する目的で配置して「ファイル」分割アダプタのステップ
変数「F.I_行数」(Numericタイプ)で設定している数値(現在の設定値(デフォルト値):35000)で12万超のデータを4つのファイルに分割している
設定画面
2.2.7 「NOP」ステップ(フロー図その2の①ステップ)
CSVデータ取り込み処理の並行実行の分岐のルートステップとして配置
条件:C.Sys.ErroCode = 0
C.Sys.ErrorCodeは上のステップが実行された際にセットされ、値が0の場合は正常に終了したことを示す
この下に、CSVデータ取り込み処理(データマッパー)を4つ(処理モードはパラレル)とメッセージ保存を1つ(処理モードはリニア)を配置している
2.2.8 「データマッパー Px」ステップ(フロー図その2の②~⑤のステップ)
CSVデータ取り込み処理のパラレルステップ
名前の末尾にP1-P4を付加
各ステップのプロパティの処理モードは「パラレル」を選択
これにより、このフローとは異なる別のスレッドで並行実行させることが出来る。
他のパラレルステップの「データマッパー Px」との違いは、送り元のFlatFileのプロパティのファイルパスが異なる(4分割されたファイル名を個別に指定)
2.2.9 「メッセージ保存」ステップ(フロー図その2の⑥ステップ)
並行実行している4つの「データマッパー」が完了するまで処理を待つよう、このステップのプロパティの「完了を待つ」にYesを選択している
このパラメータは処理モードが「リニア」の場合のみ選択が可能である
「完了を待つ」というパラメータ名であるが、正常に終了するか、あるいはエラーでアボートする場合のどちらも含まれる
つまり、この「完了を待つ」がYesの「メッセージ保存」ステップは、同一レベルにある「パラレル」モードのステップがすべて完了するまで待機してから最後に実行される
最後に実行される「リニア」モードのこのステップが実行されてアクティビティログにメッセージが出力されることで、「パラレル」ステップがすべて完了したことを確認できることになる
2.2.10 「BAMユーティリティ」ステップ(フロー図その2の⑦~⑩のステップ)
「パラレル」モードの「データマッパー」ステップの下の「リニア」モードの「BAMユーティリティ」アダプタのステップ
「データマッパー」ステップを並行実行するスレッドと同一のスレッドで実行される(BAMユーティリティステップの処理モードが「リニア」であるため)
「BAMユーティリティ」アダプタは、アクティビティログに指定したメッセージを出力する
「メッセージ保存」アダプタとの違いは、設定出来るパラメータが多いこととBAMユーティリティのメッセージを表示する専用のタブ画面がMagicモニタに用意されていること
2.2.11 「ファイル一括削除」ステップ(フロー図その2の⑪のステップ)
「ファイル管理」アダプタのステップ
Command Line メソッドを使用し、ファイル一括削除のバッチを使用して、分割したファイルを一括削除する
ファイル一括削除のバッチは、プロジェクトフォルダ配下のBATフォルダに配置
(BAT\delete.bat)
※ファイル管理アダプタの「Delete File」「Copy File」メソッドではパラメータにワイルドカード「*」指定は出来ないため、delete.batを用意した。
「ファイル一括削除」ステップの設定
2.2.12 「NOP」ステップ(フロー図その2の⑫のステップ)
デバッグ実行時のブレイクポイント設定するために配置した「NOP」アダプタ
デバッグ実行時、フローの最終ステップでブレイクさせたい場合のために配置している
「NOP」アダプタ自体は何も処理をしない
デバッグ実行時にブレイクポイントを設定していない時やデバッグ実行でなく通常の実行時には実行されるが、何も処理はしなく、このステップ実行後エラーシステム変数であるC.Sys.ErrorCode には「0」(正常終了)がセットされる
※このステップの処理モードが「リニア」になっているので、他のパラレルに設定しているステップのフロー内のステップでブレイクポイントを設定していな状態であれば、ここにブレイクポイントを設定してブレイクできることを確認済み
2.2.14 「メッセージ保存」ステップⒶ(フロー図その3 のステップⒶ)
アクティビティログに指定したメッセージを出力する「メッセージ保存」アダプタのステップ
条件:C.Sys.ErrorCode <> 0 (<>記号はNot Equal を示す記号
エラーシステム変数 C.sys.ErrorCodeの値が「0」でないと判定された場合にこのステップに遷移される
「ファイル分割」ステップでエラーが発生した場合にこのステップが実行されるので、そのことを示すメッセージをアクティビティログに出力している
2.2.15 「Flow Data」ステップⒷ(フロー図その3のⒷのステップ)
「F.エラーリトライ回数」変数をカウントアップする「Flow Data」アダプタのステップ
エラー発生時のリトライ回数をカウントし、回数の上限値を管理することを目的とする
このフローでは、リトライ回数の上限値(ロジックで固定)を3回とし、以降のステップの条件で、その上限値を使用して判定している。
「F.エラーリトライ回数」の値が上限値未満であれば、「ファイル分割」ステップを繰り返すイメージ
2.2.16 「遅延」ステップⒸ(フロー図その3のⒸのステップ)
指定した時間待機させるために配置した「遅延」アダプタのステップ
指定する時間の単位は10分の1秒である
例えば、「50」という値を指定すると5秒待機する
「ファイル分割」ステップが失敗した場合に、即リトライするのではなくて、一定時間待機させてからリトライさせる目的で配置している
2.2.17 「Goto」(フロー図その3のⒹ)
指定したステップに遷移させるために「Goto」を利用することが出来る
条件を指定しなければ、無条件に遷移し、条件を指定すればその条件を満たす場合遷移する
「Goto」を利用するには、ステップを選択して右クリックすると表示されるメニューから「Goto」をクリックし、マウスカーソルの形が変わり「Select Goto Destination」と表示された後、遷移したいステップをクリックする
選択したステップの下に「Goto」が表示され、クリックしたステップに向けて破線が引かれる
「Goto」に条件を設定するには、「Goto」を右クリックして表示されるメニューから「条件」をクリックすると表示される式エディタ画面にて、条件式を記述すればよい
「Goto」を右クリックして表示されるメニューには、いろいろなメニューがあり、「Goto」の削除もこのメニューから「削除」を選択すれば良い
2.2.18 「メッセージ保存:リトライ終了」ステップ Ⓔ(フロー図その3のⒺステップ)
F.エラーリトライ回数が上限値(4回)に達したことを、アクティビティログにメッセージ出力させる目的で配置したステップ
条件:NOT (F.エラーリトライ回数 < 4 )
(F.エラーリトライ回数 < 4 )の否定、つまりF.エラーリトライ回数 < 4 の判定結果がFalseの場合にTrueと判定される
このステップの処理自体は必須ではないが、 F.エラーリトライ回数が上限(3回を超える)に達したことを明確に示すために、上限値を超えた旨を示すための処理のステップを配置することをお薦めしたい
補足
a) リソースの新規登録
・Magic xpiスタジオでプロジェクトを作成するか、既存のプロジェクトを開いた状態にする。
・メニューのプロジェクト-設定をクリックし、設定画面を開く。
・設定画面の左ペインのツリーの上部のリソースにカーソルがある状態のとき、設定画面左下部の[追加]ボタンをクリックすると、新たなリソースが作成できる。
b) データベースの作成手順
・SQL Server Management Studio(SSMS) を使用して、データベースを作成する手順について説明する
・SSMSを起動し、内部DB用のデータベースサーバであるSQL Serverに接続する
・オブジェクト エクスプローラーペインのツリーを展開し、データベースを右クリックして「新しいデータベース(N)」をクリックする
・「新しいデータベース」の設定画面が開く
・設定内容は下記の通り
c) リソースのパラメータでユーザー環境変数を使用する場合の注意点
・ユーザー環境変数を登録する場所と値に設定する文字
設定画面において、プロジェクト環境と一般環境の2カ所にユーザー環境変数の設定箇所が存在し、それぞれ保存先のファイルが異なる。
(プロジェクト環境:プロジェクトのifs.ini 一般環境:magic.ini)
また、値に記号を含む場合は、一般環境のユーザー環境変数を利用すること
(プロジェクト環境びユーザー環境変数の場合、値に記号があると、実行時にうまく利用できないことがある。上手くいかない場合はユーザー環境変数を使用するのを止めて、値欄に直接文字列を設定して確認するようにしてみるなどの対応を行ってください)
・使用するユーザー環境変数の名前
データベースリソースのパラメータでユーザー環境変数を使用する場合、リソース名を含むユーザ環境変数名を使用しないようにしてください。
例えば、データベースリソース名がzipcloudの場合、zipcloud_DBやzipcloud_USERやzipcloud_SERVERなどのユーザー環境変数をデータベース名、サーバ、ユーザなどのパラメータで使用すると、実行時に正常に利用できないことが確認されています。ユーザー環境変数名にリソース名の使用を避けるなどの対応を検討ください
d) 郵便番号マスタテーブル作成
・SQL Server ManagementStudioを起動して、内部DB用に使用しているデータベースサーバに接続する
・プロジェクト「zipcloudProject1」のフォルダの下の「DB_zipcloud_create_table_sql」の下にある「Create_ziptable_zipcloud.sql」をSQL Server ManagementStudioにドラッグ&ドロップして開き、そのSQL文(CreateTable文)を実行して、郵便番号マスタテーブルを作成する
・ツリーペインのツリーのデータベース「zipcloud」を展開し、テーブルに郵便マスタテーブル「ziptable_zipcloud」が作成されていることを確認する
f) FlatFileの詳細(フィールド定義)でのTips その1
FlatFileの詳細(フィールド定義)でフィールド名を容易に設定する方法
指定した区切り文字を使用してフィールド名だけを入力したCSVファイルを用意する
ファイルの例欄の右横のフォルダアイコンをクリックして表示されるファイル選択ダイアログ
注意点:
ファイルの例欄にタイトルのみ設定されているCSV形式のファイルパスが設定されている状態
[リフレッシュ]ボタンをクリックした後、フィールド定義の箇所の名に、各フィールドのタイトルが取り込まれている
・FlatFileの詳細(フィールド定義)を行ったもの情報を利用する方法
既存のフィールド定義の画面を開き、画面左下の[保存]ボタンをクリックしてFileFileスキーマ定義をファイルに保存する。
後で分かるように、確認しやすい名前を付けることをお薦めする
・設定したい詳細(フィールド定義)の画面を開き、画面左下の[読込]ボタンをクリックして、利用したいFlatFileスキーマ定義ファイルを選択し、[OK]ボタンをクリックする
定義情報が読み込まれて反映される
※[読込]ボタンと[保存]ボタンを間違えないようにしてください。
操作を誤ると、既存のスキーマ定義ファイルを上書き保存してしまうと取り返しがつかなくなります。
(スキーマ定義ファイルのバックアップを常に行っておくことはとても重要です)
※注意
[保存]ボタンで保存したFlat File スキーマ定義ファイルを編集して[読込]を行うことは止めてください
Flat File スキーマ定義ファイルのフォーマットについては公開されていません
独自に編集したスキーマ定義ファイルを読み込んで利用することで、予期しない動作に繋がる恐れがある
g) StrToken関数
例えば、カンマで区切られている文字列の各フィールドのデータを取得したいような場合に、この関数を利用することで用意に取得することが出来る。
区切り文字を含む文字列の例:0600000,北海道,札幌市中央区
カンマで区切られているこの文字列の第一フィールド(0600000)の文字列を取得するには、次のようにStrToken関数を使う
StrToken ( ‘0600000,北海道,札幌市中央区’ , 1 , ‘,’ )
StrToken関数の構文は、StrToken ( [文字列(Alphaタイプ) , [トークンインデックス(Numericタイプ)], [区切り文字(Alphaタイプ)])
戻り値:指定したトークンインデックスの文字列(Alphaタイプ)
第二フィールドの「北海道」を取得したい場合は、トークンインデックスに「2」を指定すれば良い
この関数は区切り文字を境にして文字を抽出してくれるので、開始位置や文字数(バイト数)を指定しづらい場合この関数を活用できると重宝する
2023年7月20日や2023年10月10日の7月の「7」や10月の「10」を取得したい場合だと取得したい文字数が異なるが、StrToken (StrToken (F.日付 , 1 , ‘月’ ) , 2 , ‘年’ )で取得できる(※「F.日付」変数に「2023年7月20日」や「2023年10月10日」などの文字列が保存されているとする)
(月を区切り文字としその第一フィールド「2023年7」または「2023年10」を取得し、年を区切り文字としその第二フィールド「7」または「10」が取得される)
h) データマッパーのマルチアップデート
・データマッパーの送り先ノードのフォルダアイコンのプロパティのマルチアップデートは、条件欄よりも先に実行されることを理解しておくことはとても重要
・マルチアップデートに設定している各行の条件欄に条件式を設定していれば、その条件を満たした場合に実行され、条件欄を設定していなければレコードが読み込まれる度に実行される
コメント
0件のコメント
記事コメントは受け付けていません。