我目前正在处理的代码应该在一个文本文档中吐出每一行信息,其中包含单词" DEBUG"然后将其粘贴到标题为" debug.txt"的新文本文档中。
无论出于何种原因,它只是将最后一行打印到新的文本文档中,我不知道为什么。但是,另一个功能是将每一行吐回到命令终端,并且它成功完成,它只是不会将它们全部写入文件。
log_file = File.open("main_file.rb")
File.readlines(log_file).each do |line|
if line.include? "DEBUG"
puts line
File.open("debug.txt", "w") do |out|
out.puts line
end
end
end
答案 0 :(得分:1)
每次在main_file
中找到DEBUG行时,您都会覆盖该文件。你的积木倒退了。 File.open('debug.txt')
应该在File.readlines
之外。
像这样:
log_file = File.open("main_file.rb")
File.open("debug.txt", "w") do |out|
File.readlines(log_file).each do |line|
if line.include? "DEBUG"
puts line
out.puts line
end
end
end
您还可以在'a'
调用中传递'w'
而不是File.open('debug.txt')
,以追加模式打开文件,但每次找到包含该行的行时,这将不必要地重新打开文件调试它。如上所示,最好打开调试文件一次以便编写和使用文件句柄。
答案 1 :(得分:1)
像这样写:
File.open("debug.txt", "w") do |out|
File.foreach("main_file.rb") do |line|
if line['DEBUG']
puts line
out.puts line
end
end
end
你需要:
注意我不打开文件输出作为一个步骤。 Ruby对块的使用非常方便:通过将块传递给open
,Ruby将在块退出时关闭文件,避免打开文件的问题,使内存混乱或消耗可用的文件句柄。
使用foreach
读取文件。它一次读取一行并且非常快。它也具有可扩展性,这意味着它可以同样适用于单行文件或1000万行文件。在代码中使用readlines
会导致Ruby将整个文件加载到内存中,将其拆分为单独的行,然后迭代它们。如果输入文件超出可用RAM,则可能导致实际问题。
line['DEBUG']
是"为此文字"执行子字符串匹配的简写。有关详细信息,请参阅String#[]
。