我有一个包含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
答案 0 :(得分: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 $$,那么就需要添加一些条件逻辑。
答案 1 :(得分: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$$"