Talendでディレクトリの中にある一番最新ファイルを取得する方法
はじめに
忘れない内にまたTalendネタを書きます。 ディレクトリの内に複数のファイルがあり、その中から最新のファイルのみを処理したい場合があります。 今回は、そういった場合にTalendでどう作るかをご紹介します。
環境
今回使用した環境は以下の通りです。
- Windows8.1 64bit
- Talend Open Studio 6.2.0
- Java 1.8
実装
日次でCSVファイルがアップロードされて、差分をDBに登録するというジョブを作ってみます。
例として、ディレクトリ構成は以下の様な構成の場合で考えてみます。 yyyyMMddにはアップロードされた日付が入るとします。
csv/ └─URIAGE/ └─yyyyMMdd/ └─uriagedata.csv
実際に作ったジョブは以下のようなジョブになりました。
tFileListでディレクトリの中にあるファイルの情報を取得しています。 tFileListを他のコンポーネントとIterateでつなげて、取得したファイルの分だけつなげたコンポーネントの処理を動作します。 基本設定コンポーネントのディレクトリに、取得したいデータのあるディレクトリを記述します。 今回はディレクトリに日付が入っているという想定なのでディレクトリには日付のフォルダは入力せずに、 "サブディレクトリを含む"チェックボックスにチェックを入れておきます。
tFileListで取得したファイルの情報は、Iterateでつなげられたコンポーネントで以下のようにしてglobalMapから取得できます。
(String)globalMap.get("tFileList_1_CURRENT_FILE");
tFileListコンポーネントを使用した場合、globalMapから取得できるのは以下の5つです。
キー | 値 | 例 |
---|---|---|
"tFileList_1_CURRENT_FILE" | ファイル名 | uriage.csv |
"tFileList_1_CURRENT_FILEPATH" | ファイルの絶対パス | C:\File\csv\uriage\20160701\uriage.csv |
"tFileList_1_CURRENT_FILEDIRECTORY" | ファイルのあるディレクトリ | C:\File\csv\uriage\20160701 |
"tFileList_1_CURRENT_FILEEXTENSION" | ファイルの拡張子 | csv |
"tFileList_1_NB_FILE" | 何回目の繰り返しか | 1 |
tIterateToFlowでは、tFileListで取得した情報をスキーマの形に変換しています。
今回の例でいえば、tFileListから取得した情報を表のような形にしているイメージでしょうか。
fileName | filePath | fileDir |
---|---|---|
uriage.csv | C:\File\csv\uriage\20160701\uriage.csv | C:\File\csv\uriage\20160701 |
tSortRowコンポーネントでファイルディレクトリを降順にソートすることで、最新の日付のファイルが1番上に来ます。
tSampleRowコンポーネントで1番上のデータのみ抽出することで、最新データのファイルパスを取得することができます。
あとはtFlowToIterateを使用して、処理の流れをIterateの形に戻してtMYsqlBulcExecでDBにデータを投入すればよいです。 tMysqlBulkExecのローカルファイル名には、抽出したファイルパスを指定してください。 今回の場合は、globalMap.get("row3.filePath")で取得することができます。
tMysqlBulkExecの注意点については前回のエントリをみて頂ければと思います。
おわりに
今回の例では、1番最新のファイルを取得する方法をご紹介しました。 色々と応用も効くと思うので何かのお役に立てば幸いです。