只有"放"一行文本文档

时间:2014-07-21 18:13:07

标签: ruby

我目前正在处理的代码应该在一个文本文档中吐出每一行信息,其中包含单词" 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

2 个答案:

答案 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

你需要:

  1. 打开输出文件。
  2. 迭代输入文件中的行。
  3. 对于每一行,检查它是否包含您想要的字符串。
  4. 如果是,请写下来。
  5. 循环,直到完全读取输入文件。
  6. 关闭输出文件。
  7. 注意我不打开文件输出作为一个步骤。 Ruby对块的使用非常方便:通过将块传递给open,Ruby将在块退出时关闭文件,避免打开文件的问题,使内存混乱或消耗可用的文件句柄。

    使用foreach读取文件。它一次读取一行并且非常快。它也具有可扩展性,这意味着它可以同样适用于单行文件或1000万行文件。在代码中使用readlines会导致Ruby将整个文件加载到内存中,将其拆分为单独的行,然后迭代它们。如果输入文件超出可用RAM,则可能导致实际问题。

    line['DEBUG']是"为此文字"执行子字符串匹配的简写。有关详细信息,请参阅String#[]