2012-08-13 46 views
1

我有一個包含SQL轉儲行的文件。它的日期格式爲yyyy-mm-dd(例如:2012-08-13用於搜索和替換的Ruby RegEx

我想用一個標記替換所有這些日期,以便將來我可以使用所有以當時日期爲中心的行填充數據庫。

例如

  • 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

GSUB(/ \ d {4} - \ d {2} - \ d {2} /){|匹配|塊}不能幫你嗎? – godspeedlee 2012-08-13 19:58:33

回答

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$$" 
+0

謝謝我可以修改它來讀取文件並將每個日期轉換爲marker | offset格式。將其轉換回日期時,是否有修飾符用於指示零或加號後面的部分將具有可變長度?他們從-2702變成3000ish?再次感謝 – user1232971 2012-08-14 04:22:09

+0

我用我的解決方案更新了我的帖子,以便用日期替換標記。它似乎工作 – user1232971 2012-08-14 06:52:30

+0

@ user1232971我很高興這是有幫助的。標記的倒轉看起來也很有趣。感謝分享。 – Candide 2012-08-14 14:32:52

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 $$,那麼需要添加一些條件邏輯。

+0

感謝這對我有幫助 – user1232971 2012-08-14 04:22:29