我有一个格式为的文本文件:
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 :(得分: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,而且很简单。
每次尝试读取和写入同一文件时都要小心。任何崩溃都会破坏文件的完整性,因此您最好写入临时文件,然后在成功读取/写入后重命名原始文件,然后将原始文件移动到安全备份,并移动新文件在这种情况下,你仍然有你的来源和你的目的地,允许你在出现问题时进行分类。