从文件中读取某些行

时间:2011-10-17 19:08:39

标签: ruby

您刚刚进入Ruby,我正在尝试学习一些基本的文件读取命令,而我还没有找到任何可靠的来源。

我正在尝试浏览该文件中的某些行,直到文件末尾。

所以在文件里面写着FILE_SOURCES我想读取文件末尾的所有来源,并将它们放在一个文件中。

我发现打印整个文件,并替换文件中的单词,但我只是想读取文件中的某些部分。

4 个答案:

答案 0 :(得分:7)

如果你试图从一个以某种方式分隔的文件中提取一个部分,通常你会遵循这样的模式:

open(filename) do |f|
  state = nil

  while (line = f.gets)
    case (state)
    when nil
      # Look for the line beginning with "FILE_SOURCES"
      if (line.match(/^FILE_SOURCES/))
        state = :sources
      end
    when :sources
      # Stop printing if you hit something starting with "END"
      if (line.match(/^END/))
        state = nil
      else
        print line
      end
    end
  end
end

您可以根据您所在文件的哪个部分从一种状态更改为另一种状态。

答案 1 :(得分:3)

我会这样做(假设你可以将整个文件读入内存):

source_lines = IO.readlines('source_file.txt')
start_line   = source_lines.index{ |line| line =~ /SOURCE_LINE/ } + 1
File.open( 'other_file.txt', 'w' ) do |f|
  f << source_lines[ start_line..-1 ].join( "\n" )
end

相关方法:

  • IO.readlines将行读入数组
  • Array#index查找与正则表达式匹配的第一行的索引
  • File.open在磁盘上创建新文件(完成后自动关闭)
  • Array#[]获取从索引到结尾的行子集

如果你无法将整个文件读入内存,那么我会对@ tadman的基于状态的文件做一个更简单的修改:

started = false
File.open( 'other_file.txt', 'w' ) do |output|
  IO.foreach( 'source_file.txt' ) do |line|
    if started then
      output << line
    elsif line =~ /FILE_SOURCES/
      started = true
    end
  end
end

欢迎使用Ruby!

答案 2 :(得分:2)

File.open("file_to_read.txt", "r") {|f|
  line = f.gets
  until line.include?("FILE_SOURCES")
    line = f.gets
  end
  File.open("file_to_write.txt", "w") {|new_file|
    f.each_line {|line|
      new_file.puts(line) 
    }
   new_file.close
  }
  f.close 
}

答案 3 :(得分:0)

IO函数不知道文件中的“行”是什么。没有简单的方法可以跳到文件中的某一行,你必须全部阅读并忽略你不需要的行。