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 . Итак, вам нужно достаточно памяти для хранения всего массива и всего хэша. (Конечно, массив будет подходить для сборки мусора, как только цикл завершится.)