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

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

Кто-нибудь знает, как это сделать?


person btelles    schedule 09.03.2010    source источник
comment
Полностью независимый от FasterCSV, вы всегда можете использовать строку заголовка для создания хэша, который сопоставляет имена с индексами, и использовать этот хеш для индексации таблицы, используя что-то вроде a[0][cols(:name)].   -  person bta    schedule 10.03.2010


Ответы (2)


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

person Mladen Jablanović    schedule 09.03.2010

Самый простой ответ: почему?

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

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

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

person Glenjamin    schedule 09.03.2010