簡體   English   中英

Ruby 中讀取的選擇性文件

[英]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

如果您只想向前遍歷文件的行,這很容易做到。 但是,如果您想完全模仿FileIO接口(但請參閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM