我有一个CSV文件,我正在解析并在数据库中插入它的位。我想编写一个解析器,它考虑到列顺序将来可能发生变化这一事实。
我认为我可以通过将标题行作为数组抓取来完成此操作,并且对于每一行,将值放在动态创建的局部变量中(使用eval)。然而,这似乎不起作用,因为局部变量似乎不能在eval之外访问。我在其他地方读过,这在ruby 1.9中可能是正确的,但我使用的是1.8.7
代码如:
headers = ["a", "b"]
headers.each do |h|
p e_str = h+"=1"
eval(e_str)
end
puts a
根本不起作用,给予
test.rb:6:未定义的局部变量或 方法`a'用于main:Object(NameError)
虽然第3行按预期打印“a = 1”和“b = 1”
有谁知道我怎么能这样做?
答案 0 :(得分:2)
鉴于data.csv
"foo","bar","baz"
1,2,3
4,5,6
然后
#!/usr/bin/ruby1.8
require 'csv'
rows = CSV.readlines('data.csv')
header = rows[0]
data = rows[1..-1].map do |row|
{}.tap do |h|
header.each.with_index.map do |name, i|
h[name] = row[i]
end
end
end
p data
# => [{"baz"=>"3", "foo"=>"1", "bar"=>"2"}, {"baz"=>"6", "foo"=>"4", "bar"=>"5"}]
注意:需要1.8.7或更高版本。
答案 1 :(得分:1)
使用openstruct
可以获得类似的效果require 'ostruct'
x = OpenStruct.new
headers = ["a", "b"]
headers.each do |h|
x.send("#{h}=", 1)
end
puts x.a
puts x.b