2

我正在编写一个查看一组文件的脚本,检查它们是否在“@due”标签内有任何行,后跟日期范围,然后将这些行打印到单独的文件中。(基本上,我有一组文本文件,其中包含有到期日期的项目,我想要一份关于过期、今天到期和未来 4 天内到期的每日概要。)

现在,我正在用生硬的力量这样做:

tom1 = (Time.now + 86400).strftime('%Y-%m-%d')
tom2 = (Time.now + (86400 * 2)).strftime('%Y-%m-%d')
tom3 = (Time.now + (86400 * 3)).strftime('%Y-%m-%d')

等等,然后:

if line =~ /@due\(#{tom1}\)/
found_completed = true
project += line.gsub(/@due\(.*?\)/,'').strip + " **1 day**" + "\n" + "\t"
end

if line =~ /@due\(#{tom2}\)/
found_completed = true
project += line.gsub(/@due\(.*?\)/,'').strip + " **2 days**" + "\n" + "\t"
end

等等等等。

我在过去 30 天、今天和未来 4 天都这样做。我想知道,也许我需要“日期”而不是“时间”,然后设置某种范围,如果没有更优雅的方式来做到这一点。

谢谢!

4

2 回答 2

1

我相信这会奏效,或者轻轻按摩会奏效。我在极少数日期对其进行了测试,并且对他们有用。运行脚本时,请确保通过命令行将日期作为 YYYY-MM-DD 传递。我写到控制台而不是另一个文件,这样我就可以更容易地检查测试值。如果文件中的一行没有格式正确的日期值,我使用了 begin-rescue 块。

require 'date'

def due(due_dates)
    due_dates.each do |x|
        puts x
    end
end

today = Date.parse(ARGV.shift)

f = File.readlines('path_to_file')

due_today = []
due_within_four = []
past_due = []
f.each do |line|
    begin
        d = Date.parse(line)
        due_today << line if d == today
        due_within_four << line if (today+1..today+4).cover? d
        past_due << line if (today-30..today-1).cover? d
    rescue 
        next
    end
end

puts "DUE TODAY"
due(due_today)

puts "\nDUE WITHIN FOUR DAYS"
due(due_within_four)

puts "\nOVERDUE"
due(past_due)
于 2013-06-12T21:09:14.570 回答
0

有些人可能会争辩说,对于这样一个相对简单的情况来说,这太过分了,但我喜欢使用 ice_cube ( https://github.com/seejohnrun/ice_cube ) gem 来实现重复日期功能。这是一个如何处理它的例子,盐调味。

require 'ice_cube'

lines = File.readlines('myfile.txt')
start_date = Time.now - 30 * 86400
end_date   = Time.now + 4 * 86400
matched_lines = IceCube::Schedule.new(start_date).tap do |schedule|
    schedule.add_recurrence_rule IceCube::Rule.daily
end.occurrences(end_date).collect do |time|
    formatted_time = time.strftime('%Y-%m-%d')
    lines.map { |line| line if line =~ /@due\(#{formatted_time}\)/ }
end.flatten
于 2013-06-12T22:02:20.347 回答