2012-03-07 291 views
0

我在的格式的文本文件:如何更改文本文件中的日期格式?

04-01-2010 13:25 
Lorem Ipsum... 
03-28-2010 15:21 
Lorem Ipsum... 

我要更改日期格式,使得它看起來像:

2010-04-01 13:25 
Lorem Ipsum... 
2010-03-28 15:21 
Lorem Ipsum... 

我遇到的問題是我不能直接傳遞一個正則表達式到一個proc,我不知道該怎麼辦。而代碼似乎沒有寫入文件。這裏是我的代碼:

def dateFix(dateLine) 
    dateLine = dateLine.split('-') 
    newDate = dateLine.slice(2), dateLine.slice(0), dateLine.slice(1) 
    newDate = newDate.join('-') 
end 

@reg = /\b\d\d-\d\d-\d\d\d\d\b/ 

File.open('some_file.txt', "r+") { |file| 
    file.each_line { |line| 
     date = line if line == @reg 
     if date 
      file.puts line.gsub(date, dateFix(date)) 
     end 
    } 
} 
+0

我可能會使用Time.parse/mktime/strftime來完成此操作 - 您可能希望查看[時間文檔](http://ruby-doc.org/core-1.9.3/Time.html) – 2012-03-07 17:24:36

+0

使用'parse'的問題是它假定有一個'%d-%m-%Y'格式的字符串,這在美國以外是很好的,但是對於這樣的日期,我們的標準'%m-%d-%Y'作爲第二個,「03-28-2010」。沒有一個月的「28」,解析器會不斷地發牢騷.. – 2012-03-08 21:25:04

回答

3

試試這個上:

require 'date' 

INPUT_FILE = 'some_file.txt' 
OLD_FILE = 'some_file.old' 
TEMP_FILE = "some_file.#{ $$ }" 

File.delete(OLD_FILE) if (File.exist?(OLD_FILE)) 

File.open(TEMP_FILE, 'w') do |fo| 
    File.foreach(INPUT_FILE) do |li| 
    li.chomp! 
    if (li[/^(\d{2}-\d{2}-\d{4} \S+)/]) 
     fo.puts DateTime.strptime($1, '%m-%d-%Y %H:%M').strftime('%Y-%m-%d %H:%M') 
    else 
     fo.puts li 
    end 
    end 
    File.rename(INPUT_FILE, OLD_FILE) 
end 

File.rename(TEMP_FILE, INPUT_FILE) if (File.exist?(OLD_FILE)) 

這是更紅寶石般,明瞭。

每次嘗試讀取和寫入同一個文件時都要小心。任何崩潰都會破壞文件的完整性,因此最好寫入臨時文件,然後在成功完成讀取/寫入操作後重命名原始文件,然後將原始文件移至安全備份,然後移動新文件這樣,你仍然有你的來源和你的目的地,讓你在出現問題時做分流。

+0

這工作就像一個魅力。也感謝提到寫入臨時文件以保證安全。一個非常有用的筆記。 – lyonsinbeta 2012-03-07 18:08:37

+0

剛剛注意到;該文件的第一行是一個應該改變的日期,但它似乎已被跳過,我不知道爲什麼。 – lyonsinbeta 2012-03-07 18:12:00

+0

我需要更多信息。該代碼適用於您提供的樣本數據,因此第一行有什麼不同? – 2012-03-07 22:21:39

3

這是棘手的從文件中讀取數據,並寫入到它在同一時間。我建議一次讀取文件,關閉文件,然後打開文件寫入並將新內容寫回到文件中。如果出現這種情況,請務必做好備份。

+0

或者這個:打開文件閱讀,打開另一個文字,開始流式傳輸和轉換。無需做出獨立的備份:)另外,您不需要O(N)內存。 – 2012-03-07 17:32:44