Усовершенствованная сортировка массивов в Ruby - PullRequest
2 голосов
/ 31 марта 2010

В настоящее время я работаю над проектом в ruby, и я ударился о том, как мне поступить. В проекте я использую Dir.glob для поиска в каталоге и во всех его подкаталогах определенных типов файлов и размещения их в массивах. Все типы файлов, с которыми я работаю, имеют одинаковые имена и различаются по расширениям. Например,

txt_files = Dir.glob("**/*.txt")
doc_files = Dir.glob("**/*.doc")
rtf_files = Dir.glob("**/*.rtf")

Вернет что-то похожее на

FILECON.txt ASSORTED.txt First.txt

FILECON.doc ASSORTED.doc FIRST.doc

FILECON.rtf ASSORTED.rtf FIRST.rtf

Итак, у меня есть вопрос, как мне эффективно разбить эти массивы (имея дело с тысячами файлов) и поместить все файлы с одинаковыми именами в массив. Новый массив будет выглядеть так:

FILECON.txt FILECON.doc FILECON.rtf

ASSORTED.txt ASSORTED.doc ASSORTED.rtf

и т.д.. и т.д.

Я даже не уверен, что glob будет правильным способом сделать это (все файлы с одинаковыми именами находятся в одинаковых папках). Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

6 голосов
/ 01 апреля 2010

Получите все ваши файлы в один массив с Dir.glob("**/*.{txt,doc,rtf}")

Не забывайте, что у всех имен файлов тоже есть каталог, поэтому, если вы хотите отсортировать по базовому имени, тогда

files = Dir.glob("**/*.{txt,doc,rtf}").sort_by {|f| File.basename f}
0 голосов
/ 31 марта 2010

Не уверен, что это именно то, что вам нужно, но вы можете попробовать

# first get all files
all_files = Dir.glob('**/*')
# then you can group them by name
by_name = all_files.group_by{|f| m = f.match(/([^\/]+)\.[^.\/]+$/); m[1] if m}
# and by extension
by_ext = all_files.group_by{|f| m = f.match(/[^\/]+\.([^.\/]+)$/); m[1] if m}

Кстати, я не вижу связи вопроса с сортировкой.

...