talend初心者がtalendで郵便番号検索アプリを作ってみた

#はじめに
初めてのqiitaの投稿になります。
今回は研修の一環でtalendで郵便番号検索アプリを作ってみました。
[サンプルコード（Talendプロジェクトデータ）](https://github.com/rsuzuki319/qiita/tree/master/yubin_cd_search)
まず、僕なりにtalendについて解説していきたいと思います。

#talendの概要
talendとは、視覚的に開発でき、プログラム初心者でも簡単に開発できる開発ソフトです。
視覚的に開発できるとはどういうことなのか。それはtalendではコンポーネントというものがあり、そのコンポーネントを組み合わせることにより開発できるということです。
文章だけでは伝わりづらいと思いますので、実際の画面をお見せします。
![talend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/2c8c22e9-7942-8986-3a00-be64f58c13c0.png)
画像にtMap_1やtDie_1など映っていると思いますが、これら全てコンポーネントになります。
talendはこのコンポーネントを画像のように組み合わせることにより、開発ができるためコードをあまり書くことなく開発することができるのです。

#今回作ったアプリの仕様
今回のアプリの仕様は以下の通り

（１）実行時に引数として郵便番号を指定。前方一致で郵便番号を検索。1000件を超える場合、エラーメッセージを表示。
ex. 「123」で検索

<details>
<summary>結果</summary><div>

```
21件該当しました
1230851|東京都|足立区|梅田
1230873|東京都|足立区|扇
1230844|東京都|足立区|興野
1230861|東京都|足立区|加賀
1230842|東京都|足立区|栗原
1230872|東京都|足立区|江北
1230862|東京都|足立区|皿沼
1230864|東京都|足立区|鹿浜
1230865|東京都|足立区|新田
1230852|東京都|足立区|関原
1230871|東京都|足立区|椿
1230841|東京都|足立区|西新井
1230843|東京都|足立区|西新井栄町
1230845|東京都|足立区|西新井本町
1230874|東京都|足立区|堀之内
1230853|東京都|足立区|本木
1230854|東京都|足立区|本木東町
1230856|東京都|足立区|本木西町
1230855|東京都|足立区|本木南町
1230857|東京都|足立区|本木北町
1230863|東京都|足立区|谷在家
```

</div></details>
（２）検索結果をCSVファイルに保存します。

#開発工程

今回はPosgreSQLでcsvファイルを読み込みテーブルの作成、talendでそのテーブルを用いて郵便番号検索アプリの開発をしました。

##PosgreSQL

（１）データとなるcsvファイルのダウンロード
今回は全国一括の郵便番号データをダウンロードします。
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html

（２）SQL Shellを起動。以下のコマンドを入力。
csvファイルをテーブルにコピーする際は、フィールドが「"」で囲まれているので取り除いてコピーします。

<details><summary>create文</summary><div>

```
create table zip_table (koukyo_cd text, oldyubin_cd text,yubin_cd text, ktodouhuken text, ksityouson text,ktyouiki text, todouhuken text ,sityouson text, tyouiki text, tyouiki_j integer,tyouiki_b integer, tyouiki_t integer,tyouiki_y integer, koushin integer, change_r integer);
```
</div>
</details>

<details><summary>copyコマンド</summary><div>

```
\copy zip_table from 'csvファイルのパス' CSV QUOTE '"'
```

</div>
</details>

##talend

###下準備
（１）talendを起動します
　１．新規プロジェクトを作成をチェック。その後プロジェクト名を入力。
　２．既存プロジェクトを選択をチェック。１で作ったプロジェクトを選択し完了。
（２）ジョブの作成
　１．リポジトリのジョブを右クリック。標準ジョブを作成をクリック。
　２．名前を入力して完了
　＊リポジトリがない場合はメニューバーのウィンドウ→パースペクティブ→Integrationで開きます。
（３）メタデータの登録
　１．リポジトリのメタデータを開き、DB接続定義を右クリック。接続定義をクリック。
　２．名前を入力して次へ
　３．DBタイプはPostgreSQLを選択。必要事項を入力しテスト接続。接続成功が出ればFinishをクリック
![postgresql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/31bd994f-a12b-b2bf-4da3-9200b0d0d9ed.png)
　４．リポジトリのDB接続定義を開き、出てきたDBを右クリック。スキーマーの取得をクリック。
　５．NEXTをクリック
　６．PostgreSQLで作ったテーブルを選択し、NEXTをクリック。その後Finishをクリック。

###開発
下準備ができたら、コンポーネントを繋げてプログラムを作ります。
今回作ったプログラムは以下になります。
![process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/1e75be8b-c15e-49bc-ae17-83814b35de46.png)
このプログラムは青→緑→赤→紫の順番で動きます。
####青
ここでは検索番号の判定を行っています。
もし、検索番号が入力されていなかったり、数字以外の文字が入力されているとエラーが発生し、その時点でプログラムを終了するようになっています。
検索番号がきちんと入力されてかつ数字だけが入力されたときのみ緑に進むことができます。
####緑
ここでは検索番号によって引っかかった該当件数をコンテキスト変数と呼ばれるものに格納しています。
コンテキスト変数とは同じジョブ内ならどのコンポーネントでも扱えるグローバル変数のことであり、今回は以下のように定義しました。
![context.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/9b3e6e2a-98f5-9a1e-62a0-d3e455604a63.png)

<details><summary>count</summary> _該当件数を格納する変数_</details>
<details><summary>search</summary>検索番号を格納する変数</details>
<details><summary>jud</summary>検索番号の判定結果を格納する変数</details>
Defaultのところにチェックボックスがありますが、こちらにチェックをいれておきますと、実行時下記の画像のようなポップアップ画面が出てきます。
そこに値を入れることで、チェックマークを入れていたsearchにその値を入れることができます。
![search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/8ee06e39-701e-8545-5a7d-e1cd54681b54.png)


緑の処理の説明にもどります。
zip_tableでsearchに入っている検索番号を前方一致で検索。そしてzip_tableでのみ使える変数cnに検索件数を代入します。
代入されたcnの値をt_MapとtContextLoadでcountに代入します。
これにより、どのコンポーネントでも検索件数を参照できるようになりました。

####赤
ここでは緑のところで格納しました該当件数が1000件以上ならエラーとして強制終了させ、1000件未満であれば次の紫の処理に進みます。
また、エラーでも紫に進むことになったとしても該当件数はここで表示しています。

####紫
ここでは検索結果を表示し及びファイルへの出力を行っています。
zip_tableでsearchの前方一致で検索した後、t_Mapでカラムの選択を行い、tLogRowで検索結果の表示、その後FileOutputDelimitedで検索結果をファイルに保存しています。

以上が今回作った郵便検索アプリです。

#感想と今後について
今回はTalendを使って郵便番号検索アプリを作成しました。
最初は慣れないところもあり苦戦しましたが、使い方がわかると簡単に開発することができました。
今後はTalendでまだまだ使いこなせていない機能がたくさんありますので、少しでも使いこなせるよう頑張っていきたいと思います。
ここまで、お読みいただきありがとうございました。