0

内容に応じて、ファイルの各行を個別のファイルにコピーしています。各行は"foo"or"bar"で始まり、各行の最初の数文字を読み取り、ファイル名変数を動的に変更したいと考えています。

readfile = File.open("myfile.txt", 'r')
file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')

for line in readfile
  writefile = 'file_' + line[0..2]
  writefile.write(line)
end
file_foo.close
file_bar.close

writefile変数が文字列"file_foo"またはを参照しているため、これはエラーをスローします"file_bar"

エレガントな Rubyist ソリューションの提案はありますか? sendそれが実際に進むべき道である場合、ここでメソッドを適用する方法をドキュメントから見ることができませんでした。

4

3 に答える 3

2

ファイルのハッシュを作成します。

readfile = File.open("myfile.txt", 'r')

files = {
  'foo' => File.open("file1.txt", 'w'),
  'bar' => File.open("file2.txt", 'w')
}

for line in readfile
  files[line[0..2]].write(line)
end
files.each {|k, v| v.close}
于 2013-10-05T22:22:30.847 に答える
0

を探していると思いますeval。文字列を受け取り、現在のコンテキストで Ruby コードとして評価します。したがって、あなたの例は次のようになります。

readfile = File.open("myfile.txt", 'r')

file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')

for line in readfile
  eval('file_' + line[0..2]).write(line)
end

filefoo.close
filebar.close

しかし、あなたは「Rubyist」のアプローチを求めました。Usingevalは確かに Rubyist のアプローチではありません。forループの使用もありません。より Rubyist なアプローチを試してみます。

infile  = "myfile.txt"
foofile = "file1.txt"
barfile = "file2.txt"

def append_to_file(path, content)
  File.open(path, 'a') { |f| f << content }
end

IO.readlines(readfile).each do |line|
  case line
  when /^foo/
    append_to_file(foofile, line)
  when /^bar/
    append_to_file(barfile, line)
  end
end
于 2013-10-05T22:25:46.173 に答える
0

send文字列を変換しようとしているのはメソッドではなくローカル変数であるため、使用できません。

Ruby 2.1から使えるようになりますBinding#local_variable_get

for line in readfile
  writefile = binding.local_variable_get(:"file_#{line[0..2]}")
  writefile.write(line)
end
于 2013-10-05T22:27:40.877 に答える