我有一个看起来像这样的文件:
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)
我必须记住,将来每个阵列中可能有任意数量的元素,但数字将彼此相等。
任何想法?
答案 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}}保持原样。