はじめて触ったRubyでTSVをマスキング処理。 | Developers.IO
を見ていて、(初めてという記載があるので、全然致し方ないと思います。斧投げてるつもりは全くないです。頑張って欲しいです。)全然rubyっぽくないscriptだったので、反射的にリファクタしてみました。
- 色々問題あり(ここはruby関係ないですが、スコープが大きい、メソッドがない、変数名が微妙など)
- eachが使われていない(headerとdata部分を分けて扱うことを検討した結果、forを利用しているようですが、基本for無しでいけます。)
- 元の書き方ではoutputのclose処理が不要
やってみた
class MaskingTsvFile OUTPUT = "masked.tsv" def exec(input_file) lines = open(input_file).readlines.map(&:chomp) out = open(OUTPUT, "w") out.puts lines[0] lines.shift lines.each do |line| fields = line.split("\t") masked_fields = fields[0...-1].push(mask(fields.last)) out.puts masked_fields.join("\t") end out.close end private def mask(unmasked_val) vals = unmasked_val.split("-") vals.map!.with_index do |val, i| (i != vals.size - 1) ? "*" * val.size : val end vals.join("-") end end if $0 == __FILE__ MaskingTsvFile.new.exec(ARGV[0]) end