【Talend】2つのコンポーネントだけで簡単に設定ファイルを読み込む

#概要
Talendを使用する際、外部化した設定ファイルを利用したい場合が多いと思います。
しかし、、、ファイルを読み込んで～
…コメント行をフィルタリングして～
…最初の「=」でkey、valueをフィールド分割して～…
と処理させるのは ~~面倒くさい~~ やりたくない。
　※tExtractDelimitedFieldsで簡単にフィールド分割できるかと思いきや
　　2つ目の「=」にも分割をかましてvalue内に「=」が使えない:innocent:

という訳で標準コンポーネントを2つ使うだけで簡単に設定ファイルを読み込む方法を残します。

#実装
以下のように2つのコンポーネントのみで実装可能です。
&#9312;tFileInputProperties
&#9313;tContextLoad

※コンテキスト変数には、「test1~7」と「memo1~2」を設定しています。

![設定ファイル読み込み_ジョブ全体2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/b2b99fec-a0ce-bf01-a0fb-a647b02e0abb.png)


##&#9312;tFileInputProperties
| iniファイル読み込み時の処理 |
|:--|
| 行頭が「#」または「;」の行はコメントと認識される  |
| セクションは角カッコ（[XXX]）の形で指定できる。<br>※今回の例のように取得モードを「すべて取得」とした場合はセクションの行がなくても読み込んでくれる |
| keyとvalueは最初の「=」または「:」で分割される  |
| 2つ目以降の「=」または「:」はvalueの値として読み込まれる|
| 空行は無視される  |
| keyとvalueの前後の半角スペース、タブはトリムされる  |
| Javaのコメントアウト /* */ は効果がない  |

###基本設定
![tFileInputProperties_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/241cbbd2-cef4-3a70-9b03-03690a1734d3.png)

<table>
  <tr>
    <th>スキーマ</th><td>固定値。フォーマットや取得モードに応じて変化する。</td>
  </tr>
  <tr>
    <th>フォーマット</th><td>「.ini」or 「.properties」<br>※「.properties」を選択した場合、全角文字が文字化けするため「.ini」推奨</td>
  </tr>
  <tr>
    <th>取得モード</th><td>フォーマットに「.ini」を選択した場合に設定可能。<br><br>
【すべて取得】<br>
　セクションに関係なくすべての設定を取得する<br><br>
【セクションを取得】<br>
　セクション名のみを取得する<br><br>
【セクションごとに取得】<br>
　指定したセクションの設定のみ取得する
    </td>
  </tr>
  <tr>
    <th>ファイル名</th><td>読み込む設定ファイルを指定</td>
  </tr>
</table>

###詳細設定
![tFileInputProperties_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/669508e0-f3fa-7b8a-52c7-7accb4fed891.png)

<table>
  <tr>
    <th>エンコーディング</th><td>読み込みファイルの文字コードを設定する。<br>※Shift_JISの設定ファイルを読み込む場合は「Windows-31J」または「MS932」を設定してください。<br><br>※ファイルの文字コードがCP932の場合は「SJIS」、「Shift_JIS」でも問題ありません。</td>
  </tr>
</table>

##&#9313;tContextLoad
key、valueのデータを渡すことで[Contexts]タブで設定したコンテキスト変数に値を設定してくれるコンポーネントです。

設定ファイルに存在するkeyがコンテキスト変数に存在しない場合の動作など、色々弄れますが今回は割愛。
公式のドキュメントでお茶を濁させてください。。。

■tContextLoad - 7.0 - Talend Help Center
[https://help.talend.com/reader/t77PffDe~1iumPvFKrl43Q/dcaRXTdbxQEQVCG6oGqgZA](https://help.talend.com/reader/t77PffDe~1iumPvFKrl43Q/dcaRXTdbxQEQVCG6oGqgZA)


#今回読み込む設定ファイル(ini)
今回のジョブで取り込む想定のiniファイルが以下となります。

```test.ini
[check]
#test1=aaa
;test2=bbb
/* 
test3=ccc
*/
　test4:　ccc
TEST4=ddd
	test5=	eee	
 test6=   f f f   
test7=aaa=bbb:ccc

[multibyte]
memo1=あいうえお
memo2=、。・￥～
```



#実行結果
コンテキスト変数にセットされている値を確認するために、最初にお見せしたジョブに処理を追加したものです。
※空白がわかりやすいようにvalueを[]で囲んでいます。

![設定ファイル読込み_実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/fa756c5b-7e7a-794b-e2ba-e7d2004702ff.png)


| key | value | 簡単な解説 |
|:--|:--|:--|
| test1  | 空文字  | 「#」でコメントアウトされているため、値がセットされない。  |
| test2  | 空文字  | 「;」でコメントアウトされているため、値がセットされない。  |
| test3  | ccc  | 「/\*」「\*/」ではコメントアウトされないため、そのまま値がセットされる。<br><br>※因みに1行に「/* test3=ccc */」と書いた場合、「/\* test3」をkeyとするため、セットされませんがコメントアウトとはなりません・・・実質コメントアウトになってますが。。。  |
| test4  | 空文字  | わかりずらいですがtest4の行のkeyとvalueの前に全角スペースが存在しているため、keyが一致せず、値がセットされません。<br>また、大文字小文字の区別をするため、TEST4の値は設定されません。  |
| test5  | eee  | keyとvalueの前後のタブはトリムされてセットされる。  |
| test6  | f f f  | keyとvalueの前後の半角スペースはトリムされてセットされる。  |
| test7  | aaa=bbb:ccc  | 2つ目以降の「=」及び「:」はvalueとして処理される。  |
| memo1  | あいうえお  | マルチバイト文字も文字化けせずにセットされる。  |
| memo2  | 、。・￥～  | マルチバイト文字も文字化けせずにセットされる。  |

#まとめ
標準コンポーネントを2つ使うだけで簡単に設定ファイルを読み込む方法を記載しました。

tFileInputPropertiesのファイル名をコンテキスト変数化することで
以下の記事のように試験用、商用と使い分けも可能ですので是非活用してみてください。

[Talend入門(13) ～設定ファイル読み込み～](https://qiita.com/airaotaku/items/92f114795108f25e6d0f#context%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80)