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

Ruby 如何更改日期';文本文件中的格式?,ruby,regex,file-io,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(dateLin

我有一个文本文件,格式如下:

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

从文件中读取数据并同时写入数据是很棘手的。我建议立即读取文件a,关闭它,然后打开它进行写入,并将新内容写回它。请务必进行备份,以防出错。

从文件中读取数据并同时写入数据是很困难的。我建议立即读取文件a,关闭它,然后打开它进行写入,并将新内容写回它。如果出现问题,请确保进行备份。

试试这个:

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))
这更像红宝石,更直接

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

试试这个:

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))
这更像红宝石,更直接


在尝试读取和写入同一文件时,请务必小心。任何崩溃都会破坏文件的完整性,因此最好先写入临时文件,然后在成功完成读/写操作后重命名原始文件,然后将原始文件移动到安全备份,然后将新文件移入。这样,您仍然有您的源和目标,允许您在出现问题时进行分类。

我可能会使用Time.parse/mktime/strftime来完成这一任务--您可能希望回顾一下使用
parse
的问题,它假设一个
%d-%m-%Y
格式字符串,这在美国之外是可以的,但与我们的标准相冲突,例如第二个日期“2010年3月28日”。没有“28”月,解析器会因此不断地抱怨..我可能会使用Time.parse/mktime/strftime来完成这一任务--您可能希望回顾一下使用
parse
的问题是它假设一个
%d-%m-%Y
格式字符串,这在美国之外是可以的,但与我们的标准相冲突,例如第二个日期“2010年3月28日”。没有“28”这个月,解析器会不停地抱怨..或者这样:打开文件进行读取,打开另一个文件进行写入,然后开始流式传输和转换。无需进行单独备份:)此外,您不需要O(N)内存。或者:打开文件进行读取,打开另一个文件进行写入,然后开始流式处理和转换。无需单独备份:)此外,您不需要O(N)内存。这就像一个魅力。还感谢您提到要安全地写入临时文件。一个非常有用的注释。刚刚注意到;文件的第一行是应该更改的日期,但它似乎已被跳过,我不知道为什么。我需要更多信息。代码使用您提供的示例数据,那么第一行有什么不同呢?我真的不确定区别是什么。我的示例数据与实际数据的结构完全相同。起初我认为这是因为那天是用一个数字而不是两个数字列出的,但当我加上前导零时,我得到了相同的结果(没有变化)。更新:我通过添加一个主要的新行来实现它,我的意思是,日期/时间不再是第一件事;有一个空白的新行,然后是数据。添加一个空白行应该没有什么区别。它将由
else
子句处理。这就像一个符咒。还感谢您提到要安全地写入临时文件。一个非常有用的注释。刚刚注意到;文件的第一行是应该更改的日期,但它似乎已被跳过,我不知道为什么。我需要更多信息。代码使用您提供的示例数据,那么第一行有什么不同呢?我真的不确定区别是什么。我的示例数据与实际数据的结构完全相同。起初我认为这是因为那天是用一个数字而不是两个数字列出的,但当我加上前导零时,我得到了相同的结果(没有变化)。更新:我通过添加一个主要的新行来实现它,我的意思是,日期/时间不再是第一件事;有一个空白的新行,然后是数据。添加一个空白行应该没有什么区别。它将由
else
子句处理。