2012-03-07 18 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... 

など

問題は私はprogeに直接正規表現を渡すことができないと私はそれを行う方法がわからないです。そしてコードはファイルにまったく書き込まれていないようです。私のコードは以下の通りです:

+0

これを達成するためにTime.parse/mktime/strftimeを使用することがあります - [Time documentation](http://ruby-doc.org/core-1.9.3/Time.html) –

+0

'%d-%m-%Y'書式文字列を仮定しています。これは米国以外の国では問題ありませんが、標準の'%m-%d-%Y'のように第2のものとして、 "03-28-2010"。月がありません "28"とパーサーは結果として絶えず泣きます。 –

答えて

3

が上でこれを試してみてください。

同じファイルを読み書きしようとすると、いつでも注意してください。クラッシュするとファイルの整合性が損なわれるため、一時ファイルに書き込んだ後、読み取り/書き込みが正常に完了したら元の名前に変更し、元のファイルを安全なバックアップに移動して新しいファイルを移動しますそうすれば、あなたはまだあなたのソースと目的地を持っていて、何かがうまくいかなかった場合にトリアージを行うことができます。

+0

これは魅力的に機能しました。安全のために一時ファイルに書き込むことについて言及してくれてありがとう。非常に便利なメモ。 – lyonsinbeta

+0

ただ気付いた。ファイルの最初の行は変更する必要がある日付ですが、スキップされたように見えますが、理由はわかりません。 – lyonsinbeta

+0

私はより多くの情報が必要です。このコードはあなたが与えたサンプルデータと連動しているので、最初の行については何が違うのですか? –

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

またはこれ:読書のためにファイルを開き、書き込みのためにもう一つ開き、ストリーミングと変換を開始します。別々のバックアップを作る必要はありません:)また、O(N)メモリは必要ありません。 –

関連する問題