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”方法。使用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
于 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 回答