我有一个脚本,它梳理一个特定的文件夹,找到今天修改过的所有文件:
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") }
任何帮助都将不胜感激。
答案 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