Существует ли анализатор Ruby CSV, который генерирует методы получения столбцов? - PullRequest
1 голос
/ 09 марта 2010

Я пытаюсь обобщить механизм извлечения данных с помощью 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 ]

3 голосов
/ 09 марта 2010

Ну, если вы его не найдете, вы всегда можете обезьяна-патч 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 обычным способом, используя метод []. Итак, как уже спросил Гленжамин, зачем вам это вообще нужно? ;)

2 голосов
/ 09 марта 2010

Самый простой ответ будет .. почему?

Я предполагаю, что это в основном как синтаксический сахар, так что вот небольшая обезьяна, которая должна делать то, что вы хотите:

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

Обратите внимание, что любые имена полей, конфликтующие с существующими методами Row, не будут работать следующим образом.

...