3

我有一个看起来像这样的大文件:

7

bla1
blala
blabla
blab
blals
blable
bla

more here..

第一个数字告诉我将有多少个值。问题是,我只想直接指向第 11 行(文本“此处更多……”),而不必先阅读所有这些值。就我而言,我有大量的数字,因此必须对其进行优化。

你能给我推荐一些东西吗?

4

4 回答 4

5

您可能可以使用File#seek随机访问该文件。

这种方法的问题在于它只会访问指定字节偏移量的数据——而不是行偏移量。如果您的文件可以将文件开头的字节偏移量提供给列表完成的位置,那么您可以使用它。

于 2011-06-14T13:42:39.997 回答
3

你可以制作一些类似文件的东西,它会跳过前 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

如果您只想向前遍历文件的行,这很容易做到。但是,如果您想准确地模仿FileorIO界面(但请参阅Delegate参考资料),特别是如果您想支持可回退到文件的假开头,这将变得很困难。

于 2011-06-14T13:58:48.850 回答
1

这是一种优雅的方法,尽管它需要一次将整个文件加载到内存中,但可能效率不高。

File.readlines(file_path)[10..-1] # indexing starts from 0
于 2011-06-14T13:25:46.353 回答
1

我认为您不会比这更有效率,因为您将读取文件中的字节以找出什么是“行”。

f = File.open('./data')
(f.readline.to_i + 2).times { f.readline }
p f.readline
于 2011-06-15T15:21:25.663 回答