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 回答