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

时间:2012-03-07 17:17:34

标签: ruby regex file-io

我有一个格式为的文本文件:

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
    }
}

2 个答案:

答案 0 :(得分:3)

从文件读取数据并同时写入文件很棘手。我建议立刻读取文件,关闭文件,然后打开它进行写入并将新内容写回。如果出现问题,请务必进行备份。

答案 1 :(得分: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))

这更像Ruby,而且很简单。

每次尝试读取和写入同一文件时都要小心。任何崩溃都会破坏文件的完整性,因此您最好写入临时文件,然后在成功读取/写入后重命名原始文件,然后将原始文件移动到安全备份,并移动新文件在这种情况下,你仍然有你的来源和你的目的地,允许你在出现问题时进行分类。