Arrays Ruby:与特定日期最近的日期

Arrays Ruby:与特定日期最近的日期,arrays,ruby,date,Arrays,Ruby,Date,我的ruby脚本有问题。我有一个数组 files = ["2020-09-14.access","2020-09-13.access","2020-09-11.access","2020-09-10.access","2020-09-09.access","2020-09-08.access","2020-09-07.access","2020-0

我的ruby脚本有问题。我有一个数组

files = ["2020-09-14.access","2020-09-13.access","2020-09-11.access","2020-09-10.access","2020-09-09.access","2020-09-08.access","2020-09-07.access","2020-09-05.access","2020-09-04.access","2020-09-02.access","2020-09-01.access","2020-09-14.sale","2020-09-12.sale","2020-09-08.sale","2020-09-07.sale","2020-09-06.sale","2020-09-04.sale",]
包含作为文件名的值的。有两种类型的文件:访问和销售。每个文件名都包含创建文件的日期。从每种文件类型中,我只想从两天前创建的表单文件中获取这些日期较旧的值。对于文件类型销售没有问题,今天是2020-09-14,两天前创建的文件是2020-09-12.sale。但在access文件中,没有创建2020-09-12的文件,因此我希望文件的日期最接近2020-09-12,这意味着值2020-09-10。access和我在这里叠加。简而言之,我想得到这样的数组

to_del_files = [["2020-09-10.access","2020-09-09.access","2020-09-08.access","2020-09-07.access","2020-09-05.access","2020-09-04.access","2020-09-02.access","2020-09-01.access"],["2020-09-12.sale","2020-09-08.sale","2020-09-07.sale","2020-09-06.sale","2020-09-04.sale"]]
我的代码如下:

require 'date'
files = ["2020-09-14.access","2020-09-13.access","2020-09-10.access","2020-09-09.access","2020-09-08.access","2020-09-07.access","2020-09-05.access","2020-09-04.access","2020-09-02.access","2020-09-01.access","2020-09-14.sale","2020-09-12.sale","2020-09-08.sale","2020-09-07.sale","2020-09-06.sale","2020-09-04.sale",]

names = files.map {|x| x.split('.')[1] }.uniq
puts names
date = Date.today
date2ago = date -2
to_del_files = []
names.each do |item|
    tmp = files.select { |x| x =~ /#{item}/ }
    flag = tmp.select {|x| x =~ /#{date2ago}/ }
    if flag.size > 0
        index = tmp.find_index("#{flag[0]}")
        to_del_files << tmp[index..-1]
    else
        #what to do in case where there is no such date in files
    end
end
puts to_del_files

感谢您的帮助。

为了让您获得要删除的文件:

def old_files(files, date)
  files.sort.filter { |file| Date.parse(file) < date }
end


我知道您希望从与给定日期相等或早于给定日期的日期对应的文件中选择元素。如果这是正确的,你可以这样做如下

files = [
  "2020-09-14.access", "2020-09-13.access", "2020-09-11.access",
  "2020-09-10.access", "2020-09-09.access", "2020-09-08.access",
  "2020-09-07.access", "2020-09-05.access", "2020-09-04.access",
  "2020-09-02.access", "2020-09-01.access", "2020-09-14.sale",
  "2020-09-12.sale",   "2020-09-08.sale",   "2020-09-07.sale",
  "2020-09-06.sale",   "2020-09-04.sale"
]
这些返回值当然可以添加到数组中

有关日期格式指令,请参见和,后者

Date.strptime("2020-09-14.access", '%Y-%m-%d')
返回与指定日期相同的日期对象

Date.strptime("2020-09-14", '%Y-%m-%d')

为了防止将来在实现Date::strptime时可能发生的更改,strptime的参数d可以替换为d[/[^.]+/]或d[0,d.index.'.],当d=2020-09-14.access时,这两个参数都将变为2020-09-14。

感谢您的回答,但事实上我想选择两天前创建的文件。若数组不包含任何类型的文件创建在这一天,我想选择第一个更早。在上面的示例中,没有2020-09-12.access文件,但较早的文件是2020-09-10.access,我希望将此文件和任何较早的文件推送到新阵列。您可以说,如果阵列不包含当天创建的任何类型的文件,我希望更早地选择第一个。那是一个文件。后来你说。。。此文件和我要推送到新阵列的任何旧文件。。我以为你想要后者。请解释我的方法应该为我考虑的两个日期返回什么。这需要Rails或至少ActiveSupport来工作。我将此代码更改为def old_files,date files.sort{a,b | a b}.filter{file | date.parsefile。如果没有Rails标记,那么假设您想要一个纯Ruby解决方案。
files_on_or_before_target_date(files, Date.new(2020, 9, 12))
  #=> ["2020-09-11.access", "2020-09-10.access", "2020-09-09.access",
  #    "2020-09-08.access", "2020-09-07.access", "2020-09-05.access",
  #    "2020-09-04.access", "2020-09-02.access", "2020-09-01.access",
  #    "2020-09-12.sale",   "2020-09-08.sale",   "2020-09-07.sale",
  #    "2020-09-06.sale",   "2020-09-04.sale"] 
files_on_or_before_target_date(files, Date.new(2020, 9, 10))
  #=> ["2020-09-10.access", "2020-09-09.access", "2020-09-08.access",
  #    "2020-09-07.access", "2020-09-05.access", "2020-09-04.access",
  #    "2020-09-02.access", "2020-09-01.access", "2020-09-08.sale",
  #    "2020-09-07.sale",   "2020-09-06.sale",   "2020-09-04.sale"]
Date.strptime("2020-09-14.access", '%Y-%m-%d')
Date.strptime("2020-09-14", '%Y-%m-%d')