我正在将文件的每一行复制到单独的文件中,具体取决于内容。每行以"foo"
或"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
方法,那么{/ 1>}方法可以应用于此。
答案 0 :(得分: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}
答案 1 :(得分: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”方法。使用eval
肯定不是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
答案 2 :(得分: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