[Talend] CSV ファイル内の特定文字列を置換する

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

「CSV データにヌル文字が含まれているので除去したい。」といったケースを想定します。

"1","tazwH4","Bp1u9c","^@","zvgqxv","4vZsGm"
"2","9dgxtO","^@","igteYw","OJJExr","1qbLiq"
"3","6zGFbt","U2mcRn","2UxMsA","fHeV0u","4gFq5N"
"4","yfwwl9","ECAa7R","MVYkRt","^@","wUsAR1"
"5","^@","ZeH0qX","HHc666","0uNCZN","tMXdQ2"
"6","1DbpX8","zwQDKd","DX7gJc","ZQaSQ5","kYpduT"
"7","MTGv4I","^@","WanWZE","PNRUXW","^@"
"8","iR6st5","xfSfF8","^@","Ai9qps","GjFZY6"
"9","uYFSVU","94KFYc","^@","^@","kW22tH"
"10","kHcYXy","^@","^@","GI6Xs7","2MZOyv"

※「^@」はヌル文字を表しています。

Talend で値を置換する際には「tReplace」コンポーネントを使用しますが、各カラム毎に置換条件を設定するのは大変ですよね。
そんな時には CSV ファイルのロードに「tFileInputDelimited」ではなく「tFileInputFullRow」を使用します。

tFileInputFullRow

今回は以下のようなジョブをサンプルとして用意しました。

WS000000

上段のサブジョブではヌル文字をデータに含んだ CSV ファイルを生成し、下段のサブジョブでヌル文字の置換および新規 CSV ファイルへ出力を行っています。
ここで重要なのが下段左端のコンポーネント「tFileInputFullRow」です。

WS000002

このコンポーネントはテキストの1行を1データとして入力し後続のコンポーネントへ渡します。
スキーマを見てみると

WS000005

「line」というカラム一つのみですね。「tFileInputDelimited」では CSV のセパレータを認識して1行を複数カラムからなるレコードとして表現しますが、こちらは1行を1データとして表現していることが分かります。

これを「tReplace」で処理します。

WS000003

「line」に対してのみヌル文字を置換する設定をするのみで済みます。(1行に複数のヌル文字が存在しても全て置換してくれます。)

データを1行表現から CSV 区切り表現へ変換するには「tExtractDelimitedFields」コンポーネントを利用します。

WS000004

後は「tFileOutputDelimited」で新たな CSV ファイルとして出力すれば完了です。

"1","tazwH4","Bp1u9c","","zvgqxv","4vZsGm"
"2","9dgxtO","","igteYw","OJJExr","1qbLiq"
"3","6zGFbt","U2mcRn","2UxMsA","fHeV0u","4gFq5N"
"4","yfwwl9","ECAa7R","MVYkRt","","wUsAR1"
"5","","ZeH0qX","HHc666","0uNCZN","tMXdQ2"
"6","1DbpX8","zwQDKd","DX7gJc","ZQaSQ5","kYpduT"
"7","MTGv4I","","WanWZE","PNRUXW",""
"8","iR6st5","xfSfF8","","Ai9qps","GjFZY6"
"9","uYFSVU","94KFYc","","","kW22tH"
"10","kHcYXy","","","GI6Xs7","2MZOyv"

ヌル文字が除去出来ました!

まとめ

今回のように「tReplace」は正規表現を用いて置換を行えるので「メールアドレスのマスキング」等、他にも様々な用途で使えそうです。また「tExtractDelimtiedFields」を使用すれば CSV 区切りデータとして表現し直す事が出来るので、後続コンポーネントで行える処理の選択肢が増えるのもポイントですね。

参考