私はプログラミングがまったく初めてで、過去数週間でいくつかの Ruby チュートリアルに取り組みました。約 600 個のファイルのいくつかの単語を置き換えるプログラムが必要です。現時点では、sub と gsub を使用して、特定のファイルから読み取った変数の単語を変更することに固執しています。
My code looks like this:
Dir.glob("items/**/*.dat") do |item_dat_file|
puts "working on: " + item_dat_file + " ... "
puts
text_full = File.read(item_dat_file)
puts text_full
text_full.sub!('[UNIT]', "TESTIT")
puts text_full
残念ながら、変数 text_full の両方の出力は同じで、何も置き換えられません。
[ U N I T] #=> should be changed
...
[ / U N I T ]
utf-16 リトル エンディアン エンコーディングからファイルを読み取っています (これは、ファイルが属しているゲームが私に与えているものです)。これが問題でしょうか?それを ruby 変数に読み込んだ後、すべての文字の間にスペースが追加されるためです。また、Ruby は、item_dat_file.encoding について、ファイルが UTF-8 であると教えてくれます。
どうもありがとうございました。
編集:
RubyでUTF-16ファイルを開くヒントを見つけました。コードを変更しました:
Dir.glob("items/**/*.dat") do |item_dat_file|
puts "working on: " + item_dat_file + " ... "
text_full = File.open(item_dat_file, "rb:UTF-16LE:UTF-8").read
puts text_full.sub("UNIT", "TESTIT")
puts text_full
end
これで、印刷されたテキストは問題なく、追加の空白文字はなくなりました。しかし、ファイルに書き戻すときに、これを元に戻すにはどうすればよいでしょうか? 最後に再びUTF-16にする必要があります。
EDIT2:
これが私の最初の質問に対する私の解決策です。
Dir.glob("items/**/*.dat") do |item_dat_file|
puts "working on: " + item_dat_file + " ... "
text_full = File.open(item_dat_file, "r:UTF-16LE:UTF-8").read
text_full.sub!("UNIT", "TESTIT")
puts text_full
File.open(item_dat_file, "w:UTF-16LE").write text_full
end
期待どおりに動作します。助けてくれたTHXたくさん。