将Ruby输出写入文件

时间:2013-12-17 03:30:59

标签: ruby terminal

我有一个脚本,它梳理一个特定的文件夹,找到今天修改过的所有文件:

Dir.glob("/path/to/folder/*/*.txt") do |file|
    f = File.open(file.strip)
    lines = f.readlines
    mod = f.mtime
    modtime = f.mtime.strftime("%I:%M%p")
    text = lines.join
    wordcount = text.split.length
    project = File.basename(file).gsub(/.txt/, ' ').strip
    if mod > (Time.now - 86400)
        found_completed = true
        entry = "#{modtime} - #{project} - #{wordcount}"
    end
    if found_completed == false
    puts "not today"
    end
    if found_completed == true
    puts "worked on #{entry}"
    end
end

一切正常。但是,我还将多行输出写入文件。当我将它添加到脚本的末尾(在最后的'结束'之前)时,它会显示为空白:

open('/path/to/newfile.txt', 'w') { |f|
  f.puts ("#{entry}" + "/n/n") }

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

每次通过glob循环打开文件,覆盖文件,最后处理的文件产生空白条目?

你可能希望用文件打开来包围glob,所以只打开一次,把f.puts行放在现在的位置。

修改

这是一个更为惯用的红宝石......把它分解成一个类,保持部分小而孤立的含义,给它意图揭示功能名称。我确信还有更多工作要做,但我认为这样可以更容易阅读。

class FileInfo
  def initialize(file)
    @file = File.open(file)
  end

  def wordcount
    @file.read.scan(/\w/).size
  end

  def mtime
    @file.mtime
  end

  def formatted_mtime
    @file.mtime.strftime("%I:%M%p")
  end

  def project
    File.basename(@file.path).gsub(/.txt/, ' ').strip
  end

  def recent?
    @file.mtime > (Time.now - 86400)
  end
end

open('logfile.txt', 'w')  do |log|
  Dir.glob("/path/to/folder/*/*.txt") do |file|
    fi = FileInfo.new(file)
    if fi.recent?
      log.puts "worked on #{fi.formatted_mtime} - #{fi.project} - #{fi.wordcount}"
    else
      log.puts "not today"
    end
  end
end

答案 1 :(得分:1)

只需将变量名f更改为ff,然后执行:

entry = nil
if mod > (Time.now - 86400)
   found_completed = true
   entry = "#{modtime} - #{project} - #{wordcount}"
end
open('/path/to/newfile.txt', 'a+') {|ff| ff.puts entry }

或:

if mod > (Time.now - 86400)
   found_completed = true
   entry = "#{modtime} - #{project} - #{wordcount}"
   open('/path/to/newfile.txt', 'a+') {|ff| ff.puts entry }
end

要打开文件进行写入/读取操作,然后使用它,请执行:

fstore = open '/path/to/newfile.txt', 'a+'
...
fstore.puts entry
...
fstore.close