[Talend] CSV ファイル内の特定文字列を置換する
「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
今回は以下のようなジョブをサンプルとして用意しました。
上段のサブジョブではヌル文字をデータに含んだ CSV ファイルを生成し、下段のサブジョブでヌル文字の置換および新規 CSV ファイルへ出力を行っています。
ここで重要なのが下段左端のコンポーネント「tFileInputFullRow」です。
このコンポーネントはテキストの1行を1データとして入力し後続のコンポーネントへ渡します。
スキーマを見てみると
「line」というカラム一つのみですね。「tFileInputDelimited」では CSV のセパレータを認識して1行を複数カラムからなるレコードとして表現しますが、こちらは1行を1データとして表現していることが分かります。
これを「tReplace」で処理します。
「line」に対してのみヌル文字を置換する設定をするのみで済みます。(1行に複数のヌル文字が存在しても全て置換してくれます。)
データを1行表現から CSV 区切り表現へ変換するには「tExtractDelimitedFields」コンポーネントを利用します。
後は「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 区切りデータとして表現し直す事が出来るので、後続コンポーネントで行える処理の選択肢が増えるのもポイントですね。