是否有Ruby CSV解析器生成列getter方法?

时间:2010-03-09 15:28:59

标签: ruby csv fastercsv

我正在尝试使用Ruby推广数据检索机制,并且似乎无法找到一种方法来检索CSV文件并使用点运算符访问行的列之一,如下所示:

假设我有一个CSV表:

#some_file.csv
name,age
albert,13

我从中创建了一个FasterCSV表:

a = FasterCSV.new(File.open('some_file.csv'), :headers => :first_row)

然后,当访问一行时,我希望能够说:

a[0].name
=> 'albert'

而不是

a[0]['name']
=> 'albert'

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:3)

好吧,如果你找不到一个,你总是可以修补FasterCSV::Row类,如:

class FasterCSV::Row
  def method_missing(m,*args)
    if self.field?(m.to_s)
      return self[m.to_s]
    else
      super
    end
  end
end

(我自己没有尝试过代码。)

PS。在概括数据检索机制时,我假设CSV只是您计划支持的几个数据源之一。那么逻辑上就是为每个数据源创建一个包装类,带有一些通用接口(可能会也可能不会使用访问器来访问行字段)。但是在它下面仍然应该使用[]方法以常规方式访问CSV行。所以,正如Glenjamin已经问过的,为什么你需要这个呢? ;)

答案 1 :(得分:2)

最简单的答案是......为什么?

我会假设它主要是语法糖,所以这里有一个小的monkeypatch应该做你想要的:

class FasterCSV::Row
  def method_missing(row)
    field(row)
  end
end

请注意,与现有Row方法冲突的任何字段名称都不会像这样工作。