Сортировать и перечислять файлы из каталога в числовом порядке - PullRequest
2 голосов
/ 19 октября 2011

Это моя структура папок.

/ home / файлы / встречи 9-22-11-0.jpg .. / home / файлы / встречи 9-22-11- [n] .jpg

puts Dir.glob("/home/files/*.jpg")[0] 

Когда я выполняю вышеуказанный код, он отображает шестой файл (индекс 5 => / home / files / встречи 9-22-11-5.jpg), но на самом деле мне нужен вывод в качестве первого файла (индекс 0 = > / home / files / встречи 9-22-11-0.jpg)

Как я могу отсортировать файлы в порядке, определенном пользователем? как

Когда я пытался ..
.. [0] => / home / files / встречи 9-22-11-5.jpg
.. [1] => / home / files / встречи 9-22-11-21.jpg
.. [2] => / home / files / встречи 9-22-11-39.jpg

Но мне нужно
.. [0] => / home / files / встречи 9-22-11-0.jpg
.. [1] => / home / files / встречи 9-22-11-1.jpg
.. [2] => / home / files / встречи 9-22-11-2.jpg

Дополнительная информация, сортировка тоже не работает.

f = Dir.glob ("/ home / files / *. Jpg"). Sort
f [0] => / home / files / встречи 9-22-11-0.jpg
f [0] => / home / files / встречи 9-22-11-1.jpg
f [0] => / home / files / встречи 9-22-11-10.jpg
f [0] => / home / files / встречи 9-22-11-11.jpg

Ответы [ 2 ]

11 голосов
/ 19 октября 2011
puts Dir.glob("/home/files/*.jpg").sort

сработало бы, если бы у вас был формат вроде 11-09-22-05.jpg вместо 9-22-11-5.jpg.Вместо этого вы можете попытаться отсортировать их по числу.

Dir.glob("/home/files/*.jpg").sort_by {|s| s.gsub("-","").to_i }

Но так как у вас есть номер месяца-года-года, я думаю, что правильный способ сортировки немного сложнее, чем этот.

arr=%w[9-22-12-33.jpg 9-22-11-5.jpg 9-22-10-99.jpg 12-24-11-1.jpg]
arr.sort_by do |s|
  t = s.split("-").map(&:to_i)
  [t[2], t[0], t[1], t[3]]
end

Работает путем переформатирования 9-22-11-5.jpg в массив, содержащий [11, 9, 22, 5], а затем сортирует по нему.

1 голос
/ 19 октября 2011

Если возможно, я бы вместо этого создал файлы с числовым форматом фиксированной ширины:

encounters 9-22-11-05.jpg
encounters 9-22-11-11.jpg
encounters 9-22-11-99.jpg

Если это невозможно, вы можете извлечь последнюю числовую часть и использовать ее в пользовательском критерии сортировки:

a = Dir.glob("*.jpg")
r = Regexp.new(".*-([0-9]+).jpg")
b = a.sort do |f1, f2|
  n1 = r.match(f1)[1].to_i
  n2 = r.match(f2)[1].to_i
  n1 <=> n2
end
puts b

Извлекает последнюю числовую часть из каждого имени файла (используя регулярное выражение) и сортирует по этому.
Если у вас есть файлы, относящиеся к разным датам, вам придется изменить это так, чтобы они сортировались по их «базовым» именам плюс числовая часть.

...