1

SQL ダンプの行を含むファイルがあります。形式の日付がありますyyyy-mm-dd(例: 2012-08-13)

これらすべての日付をマーカーに置き換えて、将来、その時点の日付を中心にすべての行をデータベースに入力できるようにしたいと思います。

例えば

  • 2012-08-13のようなものとして保存されるように変更したい$$MAINDATE$$
  • 2012-08-14なりたい$$MAINDATE+1$$

このようにして、それらはすべて単一の日付に関連して保存され、データは新しい作成日から前後に意味をなします。

次に、ファイルを反復処理し、その時点での引数に基づいてすべてを新しい日付に置き換えたいと思います。そして、+1 または +100 に基づいて調整された日付、またはそれが最後になるまでの日数。

マッチテキストは/\d{4}-\d{2}-\d{2}/

しかし、古いテキストを取り上げて置き換える新しい用語と一致するテキストを置き換えるにはどうすればよいでしょうか?

アップデート:

これを使用して、マーカーを日付に戻しました..きれいだとは思いませんが、機能しているとは思えません

#iterate each line and look for the marker
while (line = infile.gets)
 str = line
#replace marker with data modified by the modifier
rules = Hash[str.scan(/(\$\$MAINDATE(\+|\-)\d{1,5}\$\$)/).uniq.collect do |e| 
    modifyValue = e[0].split(e[1])[1].gsub("$","").to_i
    if e[1] == "-" then
        modifyValue = modifyValue * -1 
    end
    [e[0], (today + modifyValue).to_s] 
end    ]
  rules.each do |key, value|
    str.gsub!(key, value)
  end
#write new line to array
finishedText.push str
end
4

2 に答える 2

2

このようなもの:

require 'date'
def munge_dates list, base_date = Date.today
  date_regexp = /\d{4}-\d{2}-\d{2}/
  list.map do |line|
    days_difference = "%+d" % (Date.parse(line[date_regexp]) - base_date)
    line.sub date_regexp,"$$MAINDATE#{days_difference}$$"
  end
end

そこに $$MAINDATE+0$$ が必要ない場合は、条件付きロジックを追加する必要があります。

于 2012-08-13T20:12:16.553 に答える
1
require "date"

def format_log(str, marker, refdate)
  rules = Hash[str.scan(/\d{4}-\d{2}-\d{2}/m).uniq.collect{|e| [e, (Date.parse(e)-refdate).to_i]}]
  rules.each do |key, value|
    replacement =  "%s%s" % [value >= 0 ? "+" : "", value]
    str.gsub!(key, marker % replacement )
  end
  str
end

p format_log("2012-08-13\n2012-08-14\n2012-08-12", "$$MAINDATE%s$$", Date.today)

出力します

"$$MAINDATE+0$$\n$$MAINDATE+1$$\n$$MAINDATE-1$$"
于 2012-08-13T20:18:55.487 に答える