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 に答える