【问题标题】:Sort and list the files from a directory in numeric order按数字顺序对目录中的文件进行排序和列出
【发布时间】:2011-10-19 10:30:55
【问题描述】:

这是我的文件夹结构。

/home/files/encounters 9-22-11-0.jpg .. /home/files/encounters 9-22-11-[n].jpg

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

当我执行上述代码时,它显示了第六个文件(索引 5 => /home/files/encounters 9-22-11-5.jpg),但实际上我需要输出作为第一个文件(索引 0 = > /home/files/encounters 9-22-11-0.jpg)

如何按照用户定义的排序顺序对文件进行排序?喜欢

当我尝试..
..[0] => /home/files/encounters 9-22-11-5.jpg
..[1] => /home/files/encounters 9-22-11-21.jpg
..[2] => /home/files/encounters 9-22-11-39.jpg

但是,我需要
..[0] => /home/files/encounters 9-22-11-0.jpg
..[1] => /home/files/encounters 9-22-11-1.jpg
..[2] => /home/files/encounters 9-22-11-2.jpg

附加信息,排序也不起作用。

f = Dir.glob("/home/files/*.jpg").sort
f[0] => /home/files/encounters 9-22-11-0.jpg
f[0] => /home/files/encounters 9-22-11-1.jpg
f[0] => /home/files/encounters 9-22-11-10.jpg
f[0] => /home/files/encounters 9-22-11-11.jpg

【问题讨论】:

    标签: ruby-on-rails ruby sorting natural-sort


    【解决方案1】:
    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] 的数组,然后按此排序。

    【讨论】:

    • 为什么要格式化成字符串?按数组排序将具有相同的语义:arr.sort_by do |s| t = ...; [t[2], t[0], t[1], t[3]]; end
    • @Qerub 谢谢,我完全忘记了你可以这样做。
    • @JonasElfström:很高兴提醒您! (随时为我的评论点赞!:])
    • 我会使用 s.scan(/\d+/).last(4).map(&:to_i) 而不是 split,以允许在文件名中使用任意前缀。
    【解决方案2】:

    如果可能,我会创建具有固定宽度数字格式的文件:

    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
    

    这会从每个文件名中提取最后一个数字部分(使用正则表达式)并按此排序。
    如果您有属于不同日期的文件,则必须对其进行修改,以便按其“基本”名称加上数字部分进行排序。

    【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多