Проблема с инициализацией хэша в ruby - PullRequest
0 голосов
/ 10 июня 2010

У меня есть текстовый файл, из которого я хочу создать хэш для более быстрого доступа.Мой текстовый файл имеет формат (разделенный пробелами)

author title date popularity

Я хочу создать хэш, в котором ключом является автор, а оставшимся значением является массив.

created_hash["briggs"] = ["Manup", "Jun,2007", 10]

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

Ответы [ 2 ]

2 голосов
/ 10 июня 2010
require 'date'

created_hash = File.foreach('test.txt', mode: 'rt', encoding: 'UTF-8').
reduce({}) {|hsh, l|
  name, title, date, pop = l.split
  hsh.tap {|hsh| hsh[name] = [title, Date.parse(date), pop.to_i] }
}

Я добавил туда какой-то код преобразования типов, просто для удовольствия. Если вы этого не хотите, тело цикла становится еще проще:

  k, *v = l.split
  hsh.tap {|hsh| hsh[k] = v }

Вы также можете использовать readlines вместо foreach. Обратите внимание, что IO#readlines читает весь файл в массив first . Итак, вам нужно достаточно памяти для хранения всего массива и всего хэша. (Конечно, массив будет подходить для сборки мусора, как только цикл завершится.)

1 голос
/ 10 июня 2010

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

created_hash = {}
file_contents.each_line do |line|
  data = line.split(' ')
  created_hash[data[0]] = data.drop 1
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...