【Talend Open Studio 入門02】CSVデータを変換する。Talendの使い方からはじめます。

はじめに

みなさん、こんにちは!

前回までで、苦労はしましたが、やっとTalendの環境構築が完了しました。
(前回の記事はこちら⇒【Talend Open Studio 入門01】開発環境を構築する)

今回からは、やっと、Talend Open Studio によるバッチ開発を行っていきます。

さて…
何を作っていきましょうか…
いきなりMySQLと連携したり、AWSに繋いだり…なんかはハードルが高そうですよね。
というわけで、最初は、恐らく世界中で愛されているcsvファイルをデータソースにしましょう。
csvファイルを入力とし、とあるルールで変換をかけて、別名のcsvファイルとするようなバッチプログラムを作ってみましょう!

それっぽく、現場でありそうな感じの対話方式で今回の要件を決めていきましょう。

今回作るバッチジョブについて

山田さん(作り手)と支店長の会話

ここはとある販売会社です。
山田さん(作り手)と、支店長が何やら話をしています。

山田
私は山田です。社内SEをやっています。
支店長
私は支店長です。今回、山田君にとある変換プログラムを作って欲しいんだ。
山田
はい。どのようなプログラムでしょうか。
支店長
君も知っての通り、我々は販売事業をしている。取引ごとに販売実績データをCSVファイルという形で残してあるんだ。
支店長
今回、このCSVファイルを、本店に提出するためにデータを少し加工して提出しないといけなくなったんだ。
課長
この加工用のバッチを作成してはくれないか?仕様はこの紙に書いてある。
山田
ふむふむ。なるほど。この程度のバッチであれば、15分もあれば実装できますよ。
課長
おお!それは頼もしい。宜しく頼むよ。

 

という感じで、山田さんはcsvファイルの変換プログラムを作ることになりました。
ここで、変換仕様は下記のようになっていました。

  • 元々のcsv実績データの項目
    (ID, ITEM_CD, ITEM_NAME, SUURYO, TANNI, TANKA, UPDATE_DATE)を、
    本店提出用の項目
    (ID, ITEM_CD, ITEM_NAME, SUURYO, TANNI, TANKA, KINGAKU, UPDATE_DATE)
    に変換して欲しい。
  • KINGAKU項目は、SUURYO * TANKAの値をセットする
  • IDの重複を防ぐために、支店のデータのIDには、支店コードをプレフィックスとして付与して欲しい
    • この支店の支店コードは、”99″である
  • UPDATE_DATEの項目は、現在数値8桁だが、スラッシュ区切りにして欲しい

サンプルデータはこんな感じ

データは下記のような感じだとしましょう。

ID,ITEM_CD,ITEM_NAME,SUURYO,TANNI,TANKA,UPDATE_DATE
"0000000001","0000000001","りんご",3,"個",298,"20160112"
"0000000002","0000000004","みかん",11,"個",668,"20160113"

(csvデータのダウンロードはこちらからできます⇒chapter01_data.csv)

この程度なら…Excel(以下略)

はい。
まぁ、分かります。

「この程度Excelマクロで十分なんだが?」

という感想をお持ちですよね。ごもっともです。
しかし、初のTalendジョブ作成ということなので、そこはぐっとこらえて、突っ込み無しでお願いします。

実装

今までの話を総合すると、ジョブフローとしては下記の3ステップに分割できます。

  1. CSVファイルの読み込み
  2. 変換
  3. CSVファイルの出力

それでは、バッチ開発を行っていきましょう!!

と、その前に、まだ1度もジョブを作ったことがありませんでしたね。
というわけで、ジョブを作る所からやっていきましょう。

ジョブの作り方

まず、Talendを起動しましょう。
そして、なんでも良いのでプロジェクトを選択します。前回記事で作成した空プロジェクトで良いです。

プロジェクトを起動すると、下記のような画面が開きます。
(もしかしたら、「はじめに」が開くかもしれませんが、閉じてokです)

image5

初回で書きましたね。これがTalendの開発画面です。

早速、バッチジョブのプログラムを作ります。
いえ、その前に、ジョブでリポジトリを汚してもアレなんで、フォルダを作りましょう。
左側の「リポジトリ」にある、「ジョブ」を右クリック⇒コンテキストメニューでフォルダの作成をクリック。

image6

フォルダの名称入力を求められますので、テキトウに入力します。
今回は、MY_TESTにしました。

今度は、今作成したフォルダ上で右クリック⇒ジョブの作成をクリック。

image7

ジョブの作成を押下すると、下記のウインドウが表示されますので、各項目を入力していきます。

image8
絶対必須はジョブ名(Name)だけなんですが、PurposeやDescriptionも入力しないとwarningみたく表示されるので、多少面倒ですが入力しておきました。
全て入力したら右下の終了ボタンを押下します。
これでジョブが完成しました!

初めてのジョブは…真っ白ですね。

image9

ここに、コンポーネントを落としていき、線で繋げてバッチ処理を完成させます。
ここから開発作業です!気合いを程ほどにいれましょう!

ここから実際の開発作業です

少し本題から外れてしまったので、忘れてしまったかもしれませんが、今回初めて作るジョブは、

  1. ファイル入力
  2. 変換
  3. ファイル出力

の3つの大まかな処理があります。

コンポーネントを配置する

まずは、ファイル入力のためのコンポーネントを配置しましょう。
コンポーネントは、右側の「パレット」から選び、ドラッグ&ドロップでジョブビューに配置します。
また、パレットには大量のコンポーネントがデフォルトで存在すると思います。ですので、「パレット」上部にある検索を使用しましょう。
今回使用するファイル入力のコンポーネントは、tFileInputDelimited という名称ですので、検索に打ち込んでEnterを押下します。

image10

tFileInputDelimitedが見つかったら、それをドラッグして、ジョブにドロップします。
次に、2. の変換を行うコンポーネントを見つけてきましょう。
使用するのはtMapというコンポーネントです。先ほどと同様に「パレット」で検索し、ジョブに配置します。
ちなみに、このtMapですが、Talendでバッチ開発をする上で、超使います。
もう死ぬほどお世話になるので覚えておきましょう。tMapです。

image11

はい。最後に、3. の出力です。コンポーネント名称はtFileOutputDelimitedです。
が、その前に、一つコンポーネントを挟みましょう。
ログをコンソールに出力してくれるありがたいtLogRowというコンポーネントです。「パレット」で検索し、配置してください。

image12

これも、デバッグでよく使うコンポーネントです。覚えましょう。tLogRow。

コンポーネント同士を接続する

さて、一旦ファイル入力⇒変換⇒ログ出力の動作を確認してみましょう。
今まで配置したコンポーネントたちを接続していきます。

まずは、tFileOutputDelimitedを右クリック⇒Row⇒メインとクリックします。

image14

すると、マウスポインタに線がついてきます。この状態で、次につなげたいコンポーネントを選択します。
今回は、お隣のtMapをクリックします。

image15

tFileInputDelimitedとtMapがRowで接続されました。
後に詳しく説明しますが、Rowというのは、行データを次のコンポーネントに渡す接続タイプを意味します。
ここでは、入力されたcsvデータのとある1行を変換して欲しいので、Row接続を選んだ、ということです。
他に、onSubjobOKや、onComponentOkや、Iterateなどがありますが、それはまた別の機会に説明します。

ファイル入力コンポーネントの設定

ここで、ファイル入力コンポーネントの設定を行いましょう。
上記の画像のように、tFileInputDelimitedコンポーネントを選択し、下のビューで(ここ何て呼ぶんでしょうか…?)コンポーネントというタブを選択します。
このコンポーネントタブで、そのコンポーネントの設定が行えます。

  • ファイル名/ストリーム
    • 入力データのパスを設定します。ここは、csvデータを配置したパスを指定します
  • CSVの行区切り記号
    • テキストファイルの改行コードを指定します。通常、LinuxではLF、WindowsではCRLFのようですが、sakura editorでcsvデータを開いて見ると、LFになっていたので、LFを選択しています。Windowsなら通常はCRLFを選択でokかと
  • フィールド区切り記号
    • CSV(comma separated values)なので、,(カンマ)を指定します
  • CSVオプション
    • チェックを入れます

その他のオプションは…はい。画像の通り指定します。
とりあえず、コンポーネントタブでパラメータ設定をしていくんですよと。そういう感じです。

ファイル入力コンポーネントの項目定義

次は、このコンポーネントのスキーマを定義します。
スキーマというのは、項目ですね。列のことです。RDBのテーブルでいうところのカラムです。
下の方のスキーマの編集ボタンを押します。

image18

このウインドウを開いた時は、1個も定義が無いと思いますので、左下の+ボタンを押して追加していきます。
必ずしも、csvデータのヘッダ名と一致していないといけない、という訳ではありませんが、順番は重要なので、csvデータと一致させます。
データの型も定義できますので、計算で使用する場合などはInteger, Doubleなどの型を与えます。
上記の様に設定が完了したらOKを押下してウインドウを閉じます。

tMapコンポーネントの設定

次は、お隣のコンポーネント、tMapをダブルクリックします。

image16

すると、上記のようなウインドウが立ち上がります。次に、右上の出力テーブルの追加をクリック。

image17

上記ウインドウが表示されますので、とりあえずokボタンを押します。
今の操作は、編集後データを格納するための定義を行うためのものです。
今作成したout1のカラム定義を行います。下図の様に、変換先のデータ項目を定義します。

image19

定義の追加/変更などは、画面下の+ボタンなどによって行えます。

カラム定義が終わったら、データ変換とマッピングを行います。
マッピングは簡単で、左側の入力側(row1)の項目を、右側の出力側(out1)のマッピングしたい項目にドラッグアンドドロップします。
又は、out1の各項目の式に、row1.IDなどと直接記述することも可能です。
また、要求仕様として、

  1. IDに、プレフィックス”99″を付与
  2. KINGAKU項目を設け、SUURYO * TANKAの値を格納
  3. UPDATE_DATEを8桁からスラッシュ区切りに変換

という変換も行う必要があります。ID、KINGAKU項目については、捻りはないので、仕様通りに項目編集を行います。

image21

UPDATE_DATEの変換も、Javaのプログラミングをしたことがあるなら簡単ですね。
どんな方法でも良いでしょう。ただ、こうした計算式は、式ビルダを使用した方が見易いので、そちらを使いましょう。
ou1の、UPDATE_DATEの式にカーソルを合わせると、右側に「・・・」のボタンが出ますので、クリックすると式ビルダが開けます。

image20

Talendの関数や、自分で定義した関数なども下のカテゴリなどから見ることができます。今回は特に使いませんが。
編集が終わったら、OKボタンを押してウインドウを閉じます。

tMapでの編集も完了したので、tMapの編集ウインドウの右下OKボタンを押してクローズします。

ログ出力コンポーネントまで接続

やっとtMapの編集も終わりです。次のコンポーネントにリンクしましょう。
先ほどと同様に、tMapを右クリック⇒Rowを選択すると、先ほどtMapで定義したout1が選択肢に出てきますので、out1をクリックします。
お隣のtLogRowにリンク接続します。

image22

はい!やっと全てのコンポーネントが繋がりました!
初めは時間がかかるかもしれませんが、慣れると一瞬です。はい。

コンポーネントの名称を分かりやすいものに変更する

このままでも良いのですが、コンポーネント名称がデフォルトのままの物理名ですとわかりにくいので、見やすいラベルに変更しておきます。

image24

変更は簡単で、コンポーネントを選択して、下の「コンポーネント」タブの「表示」⇒「ラベルフォーマット」を分かりやすい名称にそれぞれ変更します。

一旦動作確認をしておきます

ジョブ実行方法

さて、ここまでで、正しく設定が完了していることを確認するために、一旦実行してみましょう。
ジョブの実行は、下の「実行(ジョブ …)」タブ⇒「基本実行」⇒「実行」ボタンをクリックで行えます。

image29

ジョブ実行が成功すると、上記のようになります。
tLogRowのお陰で、3,4行目に編集後の行データが表示されています。
これを見ると、IDに99のプレフィックスが付与されていること、金額の項目に数量*単価がセットされていること、日付の項目がスラッシュ区切りになっていることが確認できると思います。

エラーが発生した場合(文字エンコード設定ミスによる)

さて、上記のように正常終了にならなかったという場合は、入力ファイルの文字コードが原因かもしれません。
ちなみに、私はジョブ実行して、1度エラーで失敗しています。実は。

image25

こんなエラーが発生していました。
どうやら、ファイル入力コンポーネントの文字コードの設定が、csvファイルの文字コードと異なっていたために起きていたようでした。

文字コードが原因だとすると、下記の様に設定を修正すればエラーは発生しなくなるはずです。

image27

ファイル入力コンポーネントを選択し、「コンポーネント」タブ⇒「AdvancedSettings」⇒エンコードをcsvファイルのエンコードに合わせる。
私の場合、csvがSJISだったので、下記のように修正しました。

image28

エンコードはCUSTOM、直接SJISを指定しました。これで実行すると、先ほどのように無事成功しました。
うっかりです。

ファイル出力コンポーネントの設定

ここまでで、入力~変換処理までは問題ないことが確認できました。
後は、手順3. 出力のためのコンポーネントを配置/コンポーネント設定/リンク接続します。

ファイル出力のためのコンポーネントは、tFileOutputDelimitedですので、「パレット」から検索、配置、設定を行います。

image30

ファイル入力とほぼ同じ設定なので割愛しますね…
ファイル名だけ異なります。出力ファイル名をなんでも良いので入力ファイルと被らないように設定します。

結果を確認する

これで、これで一連の流れが完成しました!!!!!!

お疲れ様でした。

先ほどと同様、ジョブ実行し、結果を確認しましょう。

image31

ジョブ自体は問題なく流れました。
先ほど、tFileOutputDelimitedで指定したファイルの中身を確認します。

image33

想定通りのファイルが出力されていますね!

おわりに

はい。とても長くなりましたが、これで1つのジョブが完成しました。
初めてのジョブ開発ですと、結構開発に時間がかかりますが、
慣れると、どのコンポーネントを使用するか、どう設定するか、スキーマ定義は、リンク接続は、項目編集/マッピングは、などがすぐにできるようになります。
すると、大変高速にバッチ開発が行えるようになります。

今回はお題がお題なので、Talendの真価を見れていませんが、これからその有用性が体感できるようになってくると思います。

次回は、TalendのカナメであるtMapをもっと触っていこうと思います。
次回記事はこちら⇒【Talend Open Studio 入門03】tMapでマスタデータを紐づける方法

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です