如何从文件中获取特定行

是否可以从知道其行号的文件中提取特定行? 例如,只是从文件“text.txt”中获取第N行的内容作为字符串?

尝试以下两种解决方案之一:

 file = File.open "file.txt" #1 solution would eat a lot of RAM p [*file][n-1] #2 solution would not n.times{ file.gets } p $_ file.close 

您可以通过readlines索引获取它。

 line = IO.readlines("file.txt")[42] 

只有当它是一个小文件时才使用它。

 def get_line_from_file(path, line) result = nil File.open(path, "r") do |f| while line > 0 line -= 1 result = f.gets end end return result end get_line_from_file("/tmp/foo.txt", 20) 

这是一个很好的解决方案因为:

  • 您不使用File.read ,因此您不会将整个文件读入内存。 如果文件大小为20MB并且您经常阅读以便GC无法跟上,那么这样做可能会成为一个问题。
  • 您只能从文件中读取,直到您想要的行。 如果你的文件有1000行,那么获取第20行只能读取Ruby的第20行。

如果要在传递越界线时EOFError错误( EOFError )而不是返回nil,则可以使用readline替换gets

 linenumber=5 open("file").each_with_index{|line,ind| if ind+1==linenumber save=line # break or exit if needed. end } 

要么

 linenumber=5 f=open("file") while line=f.gets if $. == linenumber # $. is line number print "#{f.lineno} #{line}" # another way # break # break or exit if needed end end f.close 

如果您只想获得该线并且什么也不做,您可以使用这个衬垫

 ruby -ne '(print $_ and exit) if $.==5' file 

File有一个很好的lineno方法。

 def get_line(filename, lineno) File.open(filename,'r') do |f| f.gets until f.lineno == lineno - 1 f.gets end end 

如果你想要一个衬垫并且不关心内存使用,请使用(假设行从1开始编号)

 lineN = IO.readlines('text.txt')[n-1] 

要么

 lineN = f.readlines[n-1] 

如果你已经打开了文件。

否则最好这样做:

 lineN = File.open('text.txt') do |f| (n-1).times { f.gets } # skip lines preceeding line N f.gets # read line N contents end