はじめて触ったRubyでTSVをマスキング処理。
はじめに
基幹などからデータベースにロードする際に「0000-0000-0000」を「****-****-0000」の様にマスキングしたい場合があります。 Rubyは触ったことが無かったのですが、案件にRubyが関わってきそうだったので後学のためにもRubyで実現する方法を調べました。 ちなみにRailsではありません。
目的
TSVファイルを読み込み、カラム「number」に該当する値を「0000-0000-0000」から「****-****-0000」に置換してTSVファイルを出力する。
環境
Mac OSX 10.10.5 Yosemite Ruby 2.3.0
TSV
masking_test.tsv
id name number 1 josh milan 1111-1222-1333 2 kevin hedge 2111-2222-2333 3 chris herbert 311-322-3333
id=3のnumberだけ他と桁数が違いますが、この状態でマスキングを行います。 一人だけ古い口座番号を使っている、みたいなイメージです。
Ruby
blog_test.rb
require 'csv' #1、TSVを出力 File.open("blog_test.tsv", "w") do |outFile| #2、TSVを読み込む file = ARGV[0] tsvDatas = CSV.read(file, col_sep: "\t", headers: false) #3、ヘッダー出力 data = tsvDatas[0] for i in 0...data.size do if i < data.size-1 outFile.print(data[i] + "\t") else outFile.puts(data[i]) end end #4、レコードごとの処理 for i in 1...tsvDatas.size do str = "" #4-1 tsv1 = tsvDatas[i] #4-2 number = tsv1[2] #4-3 numArray = number.split("-") for i in 0...numArray.length do if i != (numArray.length-1) size = numArray[i].size #4-4 for k in 0...size do str << "*" end str << "-" else #4-5 str << numArray[i] end end #4-6 outFile.puts( tsv1[0] + "\t" + tsv1[1] + "\t" + str ) end #5、TSV出力処理終了 outFile.close end
解説
1、TSVを出力
File.open("blog_test.tsv", "w") do |outFile| ... end
2、TSVファイル読み込み 元ファイルはTSVですが、CSVというライブラリをrequireで読み込みます。
require 'csv'
ARGV[0]でコマンド引数(ファイルパス)を取得し、内容を配列で取得。 CSV.read(第1引数:ファイルパス、第2引数:区切り文字、第3引数:trueで1行目をヘッダーとする)
file = ARGV[0] tsvDatas = CSV.read(file, col_sep: "\t", headers: false)
3、ヘッダーをファイルに出力 配列からヘッダーの行だけ取得し、forでカラム名を一つづつ取得。 TSVなので最後のカラム名以外は"\t"を追加しています。
data = tsvDatas[0] for i in 0...data.size do if i < data.size-1 outFile.print(data[i] + "\t") else outFile.puts(data[i]) end end
forは下記の様にも書けます。
(0...data.size).each do |i| ...処理内容 end
4、レコードごとの処理 下記の処理を表しています。 4-1、TSVの内容から1行(1, josh milan, 1111-1222-1333)を抽出 4-2、そこから口座番号を抽出(1111-1222-1333) 4-3、口座番号を「-」で分割して配列に(1111, 1222, 1333) 4-4、配列の最後以外([1111, 1222])はそれぞれの桁数分を「*」にして、用意した変数strに入れる(****-****-) 4-5、配列の最後だけそのまま変数strに入れて(****-****-1333)、一行分の口座番号をマスキング完了 4-6、id、名前、口座番号をTSV形式にしてファイルに出力 TSV次の1行に進んで終わるまで同じ処理を繰り返し。
5、TSV出力処理終了
outFile.close
実行
実行文
$ ruby blog_test.rb masking_test.tsv
blog_test.tsv
id name number 1 josh milan ****-****-1333 2 kevin hedge ****-****-2333 3 chris herbert ***-***-3333
さいごに
自分の基本がJavaなのでEclipseの様なIDEを使えなくてもどかしくなりましたが何とか仕上げました。 基礎から教えてくれる動画サイトがとても参考になりました。 ドットインストール | Ruby入門 (全26回)