ファイル中のある文字列を別の文字列に変えたい
例えばこんなの。
- source.txt
■ファイル中のある文字列
・source.txt
これを下に変えたい。
- converted.txt
**ファイル中のある文字列 -source.txt
それ、ワンライナーでできるお(・∀・)!
はぁ?置換すりゃいいじゃんか。
って言われるのは承知で書きました。
ファイルテキストコンバーター
#!usr/local/bin/ruby -Ku class StringUtil require 'nkf' def self.encode(str,code = "u") NKF::nkf("-W -#{code} -m0",str) end end class TextConverter def self.encode_table(source,code = "u") keys = source.keys keys.inject({}){|h,k| h.merge(StringUtil.encode(k,code) => StringUtil.encode(source[k],code))} end def initialize(conversion_table) @conversion_table = conversion_table @target_regexp = Regexp.union(*(conversion_table.keys)) end def convert(str) str.gsub(@target_regexp) do |match| @conversion_table[match] end end end class FileTextConverter < TextConverter def convert(source) File.open(ARGV[0],"r") do |file| ext = File.extname(file.path) filename = File.basename(file.path,".*") File.open("#{filename}_converted#{ext}","w") do |new_file| file.each_line do |line| line = super(line) new_file.write(line) end end end end end
使うときはこんな感じ。
CONVERSION_TABLE = { "■" => "**", "・" => "-" }.freeze conversion_table = FileTextConverter.encode_table(CONVERSION_TABLE,ARGV[1]) ftc = FileTextConverter.new(conversion_table) ftc.convert(ARGV[0])
うーん。なんか、StringUtilを2回使っているところと、そもそもFileTextConverterの中にencode_tableメソッドがあるのが変な気がする。でも、下みたいにやるのはもっと変だしな。
class TextConverter def initialize(conversion_table,code = "u") @conversion_table = self.encode_table(conversion_table,code) @target_regexp = Regexp.union(*(conversion_table.keys)) end end
Converter#initializeは、conversion_tableをセットするものだから、conversion_table自体をいじるのはおかしいよなー。依存度があがる。渡されたものをただセットするだけのほうがいいと思う。
すると、そもそもTextConverterにencode_tableメソッドがあるのが変なのかな。
その変の感覚がまだ分かりきってないよね(ノд`)
というか、この使い捨てツール系に継承とか使うのどうなんだ・・・(汗)