Talendでディレクトリの中にある一番最新ファイルを取得する方法

talend

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

忘れない内にまたTalendネタを書きます。
ディレクトリの内に複数のファイルがあり、その中から最新のファイルのみを処理したい場合があります。
今回は、そういった場合にTalendでどう作るかをご紹介します。

環境

今回使用した環境は以下の通りです。

  • Windows8.1 64bit
  • Talend Open Studio 6.2.0
  • Java 1.8

実装

日次でCSVファイルがアップロードされて、差分をDBに登録するというジョブを作ってみます。

例として、ディレクトリ構成は以下の様な構成の場合で考えてみます。
yyyyMMddにはアップロードされた日付が入るとします。

csv/
└─URIAGE/
  └─yyyyMMdd/
    └─uriagedata.csv

talend2016070807

実際に作ったジョブは以下のようなジョブになりました。

talend2016070801

tFileListでディレクトリの中にあるファイルの情報を取得しています。
tFileListを他のコンポーネントとIterateでつなげて、取得したファイルの分だけつなげたコンポーネントの処理を動作します。
基本設定コンポーネントのディレクトリに、取得したいデータのあるディレクトリを記述します。
今回はディレクトリに日付が入っているという想定なのでディレクトリには日付のフォルダは入力せずに、
"サブディレクトリを含む"チェックボックスにチェックを入れておきます。

talend2016070802

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で取得した情報をスキーマの形に変換しています。

talend2016070803

今回の例でいえば、tFileListから取得した情報を表のような形にしているイメージでしょうか。

fileName filePath fileDir
uriage.csv C:\File\csv\uriage\20160701\uriage.csv C:\File\csv\uriage\20160701

tSortRowコンポーネントでファイルディレクトリを降順にソートすることで、最新の日付のファイルが1番上に来ます。

talend2016070804

tSampleRowコンポーネントで1番上のデータのみ抽出することで、最新データのファイルパスを取得することができます。

talend2016070805

あとはtFlowToIterateを使用して、処理の流れをIterateの形に戻してtMYsqlBulcExecでDBにデータを投入すればよいです。
tMysqlBulkExecのローカルファイル名には、抽出したファイルパスを指定してください。
今回の場合は、globalMap.get("row3.filePath")で取得することができます。

talend2016070806

tMysqlBulkExecの注意点については前回のエントリをみて頂ければと思います。

おわりに

今回の例では、1番最新のファイルを取得する方法をご紹介しました。
色々と応用も効くと思うので何かのお役に立てば幸いです。