我正在编写一个查看一组文件的脚本,检查它们是否在“@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
等。等
我在过去,当天以及未来4天这样做了30天。我想知道,也许如果我需要“日期”而不是“时间”,然后设置某种范围,如果没有更优雅的方法来做到这一点。
谢谢!
答案 0 :(得分: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)
答案 1 :(得分: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