読者です 読者をやめる 読者になる 読者になる

tsvを mask するスクリプト(勝手にリファクタリング)

はじめて触った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