レイヤーの利用
4.6 ループ
あるコンポーネントが起点となり、それ以降の処理を複数回繰り返すような構成を「ループ」
といいます。
ループの構成にする場合、コンポーネントの「ループを開始」プロパティを「はい」に設定し ます。ループ処理では、ループ開始後、終了コンポーネントやLoopEndコンポーネント(「コ ントロール」タブの「ループを終了します」)にたどり着くとループ開始コンポーネントに戻り、
その後の処理を繰り返します。コンポーネントの「ループを開始」プロパティを「はい」に設定 すると、出力ストリームのマークが、ループを表す3重の囲みになります。
4
4.6 ループ
ループの起点とすることのできる主なコンポーネントには、次のようなものがあります。
FileGet ワイルドカードで指定したファイルを1ファイルず
つループ
FileList あるフォルダのファイル一覧を取得して1情報ずつ
ループ
Mapper 入力レコードを1行ずつループ
RDBGet SELECT結果を指定行数ずつループ
RecordGet CSVファイルを読み込みながら指定行数ずつループ
(常にループ処理となります)
たとえばRDBに対してSELECT文を発行するRDBGetコンポーネントでは、ループを使
用しなかった場合、取得した結果セットをまとめて次のコンポーネントへ渡します。そしてすべ ての結果セットを一度に処理するため、大量データを扱う場合の限界は物理メモリに依存しま す。一方、ループを使用すれば、指定行数ずつ処理させることができますので、少ないメモリ使 用量での実行が可能です。
それでは「CSVファイル処理」フローを新しく修正し、ループを使用するフローを作ってみ ましょう。
1. 左上のツリーペインで「CSVファイル処理」フローを右クリックし、メニューから「複 製」を選択して、フローの名前を「CSVファイル処理(ループ)」(「( )」は全角)としま す(ツリーペインでフローアイテムを上下にドラッグすることで、フローの並び順を変え ることができます)。
2. FileGetの「ファイルパス」プロパティを「input/sample*.csv」とし、「ループを開始」プ ロパティを「はい」に変更します。
3. FilePutの「ファイルパス」プロパティの入力欄をクリックし、入力されているパスの文
字列を削除します。
このフローでは、FileGetで取得するファイル数に応じてループします。用意したサンプル ファイルは2つで、以下のものです。
ループ実行の際には、FilePutも複数回実行されますので、FilePutのファイルパスが固定の 文字列の場合、2度め以降の実行で、同名のファイルとして上書きされます(これは初期設定の 場合であり、「書込み処理」プロパティと「上書きを許可」プロパティの設定で変えることがで きます)。
そこでFilePutの「ファイルパス」プロパティの値を実行時に決定し、保存ファイル名を毎
回変えることにします。具体的には、入力対象ファイルが「input/sample1.csv」の場合に出力
4
4.6 ループ
ファイルパスを「output/loop_sample1.csv」とし、入力対象ファイルが「input/sample2.csv」 の場合に出力ファイルパスを「output/loop_sample2.csv」とします。その方法として、入力対 象ファイルのパスから最後のファイル名を取得し、その文字列の直前に「output/loop_」文字 列を付加したものを、FilePutの「ファイルパス」プロパティの値として設定します。
それには、FilePutの「ファイルパス」プロパティの値をマッパーで設定します。マッパーを ダブルクリックしてマッピングウィンドウを表示し、レイヤーを1つ追加します(ここではレ イヤーの名前を「条件なしレイヤー」とします)。続いて以下に示すマッパー関数とそのプロパ ティ設定を用いて図のようにマッピングします。
Filename 「文字列」タブの「ファイルパスからフォルダ名また はファイル名を取得」
Embed 「文字列」タブの「文字列をフォーマット」
対象 プロパティ 設定値
Filename 取り出す部分 ファイル名
Embed データ output/loop_$input1
マッピングウィンドウの入力側(左側)にあるストリーム変数の「FilePath」は、FileGetコ ンポーネント使用時に使用できる変数で、ここから実際に読み込んだファイルのファイルパスを 取得できます。ループの場合は、ループごとの処理対象ファイルのパスになります。
4
4.6 ループ
Embed関数では、Embed関数に接続した入力値を、予約語「$input1」で参照できます。
Embed関数の入力側には複数の項目を接続することができますので、それらは「$input2」、
「$input3」といった記述で参照できます。
「$input1」の代わりに、「${input1}」という書式で入力することもできます。
このフローを実行すると、新しく次のような2つのCSVファイルが生成されます。
入力ファイルである「sample2.csv」の「注文番号」項目の値には、いずれも「SJS」の文字 列が含まれていませんので、出力された「loop_sample2.csv」ファイルにはレコードデータが 含まれません。このようなとき、FileGetの直後に条件判断のコンポーネントを置くことで、入 力ファイルの「注文番号」項目の値に「SJS」文字列が含まれているファイルのみ処理を行い、
「SJS」文字列が含まれていないファイルは処理しない、といった構成(条件分岐)にすることが
できます。次のセクションで、フローに条件分岐を追加します。