2015-01-12 2 views
0

Chris Pine의 'Learn to Program'의 Ch.11에서 일하고 있습니다. 이 연습에서는 모든 폴더에서 몇 곡을 무작위로 선택해야하는 재생 목록을 만들어야합니다. 내 프로그램의 문자열이 텍스트 파일에 저장되지 않습니다.

folder = Dir['/Users/M/Music/iTunes/iTunes Media/Music/**'] 
music_folders= [] 

folder.each do |f| 
    f = f.split ('/') 
    music_folders.push f[7] 
end 


def mix arr 
    arr.each do |aa| 
    songs = Dir["/Users/M/Music/iTunes/iTunes Media/Music/#{aa}/**/*.{MP3,mp3}"] 
    shuffle(songs) 
    end 
end 

def shuffle songs 
    playlist=[] 
    x = 0 
    y = 0 
    count = songs.length 

    while y<4 
     x = rand(count) 
     if songs[x] !='used' 
     playlist.push songs[x] 
     songs[x] = 'used' 
     y= y+1 
    end 
end 
puts playlist 
end 

mix(music_folders) 

그래서 명령 출력 내가 원하는 정확히 뭔지를 제공하지만 난 그들에게 .txt 파일로 저장해야하는 방법을 잘 모르겠습니다 : 여기에 내가 쓴 것입니다. 아무도 이걸 도와 줄 수 있니? 감사!! 정확히 파일에 쓸 당신이 원하는 무엇을

+0

에 기록? 전체 music_folders 배열, 재생 목록 또는 개별 항목? – SeanNieuwoudt

+0

출력의 종류가 어떤 것인지 궁금합니다. 'p','puts '또는 화면에 인쇄하는 다른 방법은 없습니다. 'while'은'nil'을 리턴하므로'shuffle'도'nil'을 리턴합니다. 'mix' 메쏘드의'arr.each'는 원래의 배열을 반환하므로'mix'는 같은 것을 반환합니다 ('arr'). 결국, 당신의'mix (music_folder)'는 원래의 배열을 리턴해야합니다. 이 배열에는 경로가 길면 경로가 짧을 때'nil's가 포함될 수 있습니다 (경로가 짧음). 글쎄, 나는 그것을 f.last로 바꿨다. 추신. 이 메소드를 체크해야한다 :'File.file?','[] .inject','File.open' 또는'File.write'. 마지막 두 가지 방법은 글쓰기를위한 것입니다. –

+0

Opps! 실수로 중요한 라인 하나를 삭제했습니다. 나는 그것을 다시 추가했다. 나는 File.open + File을 사용했다. 쓰다! 그것은 명령 출력에 재생 목록을 인쇄하고 파일을 만들지 만 파일이 비어 있습니다 ... –

답변

0

이 (필요한 것보다 좀 더 복잡한) 파일을 읽을 것이며, 그것은 /tmp/songs.txt

ROOT = "#{ENV['HOME']}/Music/iTunes/iTunes Media/Music" 

folders = Dir["#{ROOT}/**"] 
files = folders.flat_map { |dir| Dir["#{dir}/**/*.{MP3,mp3,m4a}"] } 
songs = files.map { |file| File.basename(file) } 

File.open('/tmp/songs.txt', 'w') { |f| f.write(songs.join("\n")) } 
관련 문제