[英]Selective file read in Ruby
我有一個看起來像這樣的大文件:
7
bla1
blala
blabla
blab
blals
blable
bla
more here..
第一個數字告訴我將有多少個值。 問題是,我只想直接指向第 11 行(文本“此處更多……”),而不必先閱讀所有這些值。 就我而言,我有大量的數字,因此必須對其進行優化。
你能給我推薦一些東西嗎?
您可能可以使用File#seek隨機訪問該文件。
這種方法的問題在於它只會訪問指定字節偏移量的數據——而不是行偏移量。 如果您的文件可以將文件開頭的字節偏移量提供給列表完成的位置,那么您可以使用它。
你可以制作一些類似文件的東西,它會跳過前 N 行:
SkipFile.open("/tmp/frarees") do |ln|
puts ln # "more here.." and so on
end
puts SkipFile.new("/tmp/frarees").readline # "more here.."
像這樣:
class SkipFile
def self.open(fn, &block)
sf = SkipFile.new(fn)
return sf unless block
sf.each(&block)
end
def initialize(fn)
@f = File.open(fn)
skip = @f.readline.to_i # Skip N lines as prescribed by the file
skip.times { @f.readline } # this could be done lazily
end
def each(&block)
@f.each(&block)
end
def readline
@f.readline
end
end
如果您只想向前遍歷文件的行,這很容易做到。 但是,如果您想完全模仿File
或IO
接口(但請參閱Delegate
),尤其是如果您想支持可回退到文件的假開頭,這將變得很困難。
這是一個優雅的方法,雖然它可能不是很有效,因為它需要一次將整個文件加載到 memory 中。
File.readlines(file_path)[10..-1] # indexing starts from 0
我認為您不會比這更有效率,因為您將讀取文件中的字節以找出什么是“行”。
f = File.open('./data')
(f.readline.to_i + 2).times { f.readline }
p f.readline
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.