ruby使用不同数组的元素重命名数组元素

时间:2011-07-01 04:48:16

标签: ruby arrays mapping

我有一个看起来像这样的文件:

TTITLE0=track name 1
TTITLE1=track name 2

以及包含track01.cdda.wav.mp3track02.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 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:2)

你真的需要两个阵列吗?你可以只用一个:

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中的所有单个字符串1}}作为一大堆&#34;而不是你想要的&#34;。同样适用于File.rename。并且map并不是您想要的,因为您没有对tracks.each {|track| File.rename("#{track}", "#{tracknames.shift}.mp3") } 返回值做任何事情。但是,你可以这样做:

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

或使用each_with_index

tracknames

那将使{{1}}保持原样。