【问题标题】:Is there a Ruby CSV parser that generates column getter methods?是否有生成列 getter 方法的 Ruby CSV 解析器?
【发布时间】:2010-03-09 15:28:58
【问题描述】:

我正在尝试使用 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'

有人知道怎么做吗?

【问题讨论】:

  • 完全独立于 FasterCSV,您始终可以使用标题行创建将名称映射到索引的哈希,并使用该哈希来索引表,使用类似 a[0][cols(:name)] 的东西。

标签: ruby csv fastercsv


【解决方案1】:

好吧,如果你没有找到,你可以随时给 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 已经问过的,你为什么需要这个? ;)

【讨论】:

    【解决方案2】:

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

    我假设它主要是语法糖,所以这里有一个小猴子补丁,应该可以满足你的需求:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2010-12-03
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多