Руби хэши со списком файлов из директории mp3 - PullRequest
0 голосов
/ 03 февраля 2012

У меня тысячи mp3 названных так: record-20091030.mp3, record-20091130.mp3 и т. Д. Я хочу разобрать и получить хэш рубина year->month->[days] (hash, hash, array)

что не так с этим кодом?

#!/usr/bin/env ruby

files = Dir.glob("mp3/*.mp3")

@result = Hash.new


files.each do |file|
  date = file.match(/\d{8}/).to_s
  year = date[0,4]
  month = date[4,2]
  day = date[6,2]

  @result[year.to_i] = Hash.new
  @result[year.to_i][month.to_i] = Array.new
  @result[year.to_i][month.to_i] << day 
end

puts @result     

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Вы перезаписываете сохраненные значения (с Hash.new и Array.new) на каждой итерации цикла, вы должны делать это, только если хеш / массив равен нулю, например:

  @result[year.to_i] ||= Hash.new
  @result[year.to_i][month.to_i] ||= Array.new
0 голосов
/ 03 февраля 2012

Я пытался сделать некоторые исправления.

#!/usr/bin/env ruby

files = Dir.glob("mp3/*.mp3")

@result = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) }

files.each do |file|
  date = file[-12..-4]
  year, month, day = date.scan(/(.{4})(.{2})(.{2})/).first.map(&:to_i)

  @result[year][month][day] = file
end

@result.each_pair { |name, val| puts "#{name} #{val}"  }

# => 2009 {10=>{30=>"mp3/record-20091030.mp3"}, 
#          11=>{30=>"mp3/record-20091130.mp3"}}
#    2010 {1=>{23=>"mp3/record-20100123.mp3"}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...