ruby переименовывает элементы массива с элементами другого массива - PullRequest
1 голос
/ 01 июля 2011

У меня есть файл, который выглядит следующим образом:

TTITLE0=track name 1
TTITLE1=track name 2

и каталог, содержащий track01.cdda.wav.mp3 и track02.cdda.wav.mp3

У меня есть следующий код, который создает 2 различных массива, 1 с названиями треков и 1 с названиями треков:

tracks = Dir.glob("*.mp3")

tracknames = Array.new
File.open('read').each do |line|
  if line =~ /TTITLE/
    tracknames << line.split("=")[1].strip!
  end
end

это дает мне 2 массива:

["track name 1", "track name 2"]

и

["track01.cdda.wav.mp3", "track02.cdda.wav.mp3"]

я бы хотелпереименовать файлы во втором массиве с элементами первого массива.Итак, "track01.cdda.wav.mp3" станет "track name 1.mp3".

вот что я пробовал до сих пор:

tracks.map {|track| File.rename("#{tracks}", "#{tracknames}.mp3") }

и я получаю ошибку:

No such file or directory - track01.cdda.wav.mp3track02.cdda.wav.mp3 or track name 1track name 2 (Errno::ENOENT)

Я должен иметь в виду, что в будущемможет быть любое количество элементов в каждом массиве, но числа будут равны друг другу.

есть идеи?

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

Использование Array#zip:

tracks.zip(tracknames).each do |track, trackname|
  File.rename track, "#{trackname}.mp3"
end

Альтернативно (менее забавно, но не создает промежуточный массив массивов перед перечислением):

tracks.each_with_index do |track, i|
  File.rename track, "#{tracknames[i]}.mp3"
end
2 голосов
/ 01 июля 2011

Вам действительно нужно иметь два массива? Вы можете обойтись только одним:

tracks = Dir.glob("*.mp3")
File.open('read').each do |line|
  if line =~ /TTITLE/
    to = line.split("=")[1].strip!
    File.rename tracks.shift, "#{to}.mp3"
  end
end

И после этого ваши shift вызовы оставят tracks пустым, но это не может быть проблемой.

Насколько ваш:

tracks.map {|track| File.rename("#{tracks}", "#{tracknames}.mp3") }
Подход

идет, проблема в том, что вы вызываете to_s для массива tracks, когда вы интерполируете его как "#{tracks}", и это просто объединяет все отдельные строки в tracks вместе как одну большую кучу " не то, что вы хотите ". Аналогично для tracknames. И map не то, что вам нужно, поскольку вы ничего не делаете с возвращаемыми значениями File.rename. Тем не менее, вы можете сделать это:

tracks.each {|track| File.rename("#{track}", "#{tracknames.shift}.mp3") }

Или используйте each_with_index:

tracks.each_with_index {|track,i| File.rename("#{track}", "#{tracknames[i]}.mp3") }

Тот оставил бы tracknames нетронутым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...