Импорт данных CSV в массив / переменную ruby - PullRequest
3 голосов
/ 11 декабря 2011

Я пытаюсь использовать CSV в качестве файла настроек в плагине для проекта SiriProxy, чтобы использовать wake-on-lan. Этот проект основан на ruby.

Таким образом, CSV выглядит следующим образом:

Name, MACAddress
Desktop, 01-23-45-67-89-ab
Computer, 02-46-81-02-46-cd

и так далее ...

Итак, я хотел бы, чтобы, когда переменная userAction, например, «Desktop», я запрашивала CSV, и он возвращает MAC-адрес в другую переменную. Я заблудился о том, как это сделать. Я видел csv и fast_csv, но не знаю, как заставить их работать так.

Заранее спасибо!

Ответы [ 2 ]

9 голосов
/ 11 декабря 2011

Если вы попытаетесь использовать FasterCSV в Ruby 1.9, вы получите предупреждение о том, что стандартная библиотека Ruby 1.9 CSV на самом деле быстрее. Поэтому я использовал стандартную библиотеку Ruby CSV. Это должно работать в Ruby 1.9 или 1.8.7.

require 'csv'

module MyConfig
  @mac_address_hash = {}
  CSV.foreach("config.csv") do |row|
    name, mac_address = row
    next if name == "Name"
    @mac_address_hash[name] = mac_address
  end

  puts "Now we have this hash: " + @mac_address_hash.inspect

  def self.mac_address(computer_name)
    @mac_address_hash[computer_name]
  end

end

puts "MAC address of Desktop: " + MyConfig.mac_address("Desktop")

Вывод этого кода:

Now we have this hash: {"Computer"=>" 02-46-81-02-46-cd", "Desktop"=>" 01-23-45-67-89-ab"}
MAC address of Desktop:  01-23-45-67-89-ab

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

Вы можете улучшить этот код, чтобы лениво загружать файл CSV при первом запуске.

6 голосов
/ 12 декабря 2011

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

require 'csv'
config = CSV.read('config.csv')
config.shift # Get rid of the header
# We're done! Start using like so:
p config.assoc("Computer").last #=>" 02-46-81-02-46-cd" 

Если начальный пробел нежелателен:

config = CSV.read('config.csv', {:col_sep => ', '})
...