如何从文件中获取特定行
是否可以从知道其行号的文件中提取特定行? 例如,只是从文件“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