2012-03-07 295 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