在Ruby中解析文件时跳过行的最快方法?

DRo*_*son 9 ruby lines fileparsing

我试着寻找这个,但找不到多少.这似乎是之前可能会被问到的事情(很多次?),所以我很抱歉,如果是这样的话.

我想知道在Ruby中解析文件某些部分的最快方法是什么.例如,假设我知道我想要的特定功能的信息是在1000行文件的第500行和第600行之间.(显然这类问题适用于大型文件,我只是为了举例而使用那些较小的数字),因为我知道它不会出现在上半部分,是否有一种忽略这些信息的快速方法?

目前我正在使用以下内容:

while  buffer = file_in.gets and file_in.lineno <600
  next unless file_in.lineno > 500
  if buffer.chomp!.include? some_string
    do_func_whatever
  end
end
Run Code Online (Sandbox Code Playgroud)

它有效,但我不禁认为它可以更好地工作.

我对Ruby很陌生,并且有兴趣学习新的工作方式.

Mla*_*vić 11

file.lines.drop(500).take(100) # will get you lines 501-600
Run Code Online (Sandbox Code Playgroud)

通常,您不能避免从开始直到您感兴趣的行读取文件,因为每行可以具有不同的长度.但是,您可以避免的一件事是将整个文件加载到一个大数组中.只需逐行阅读,计算并丢弃它们,直到找到你想要的东西.非常像你自己的例子.你可以把它变得更加Rubyish.

PS.Tin Man的评论让我做了一些实验.虽然我没有找到任何理由为什么会drop加载整个文件,但确实存在一个问题:在数组中drop 返回文件的其余部分.这是一种可以避免的方法:

file.lines.select.with_index{|l,i| (501..600) === i}
Run Code Online (Sandbox Code Playgroud)

PS2:Doh,上面的代码,虽然不是一个庞大的数组,但遍历整个文件,甚至600以下的行.:(这是第三个版本:

enum = file.lines
500.times{enum.next} # skip 500
enum.take(100) # take the next 100
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢FP:

file.lines.tap{|enum| 500.times{enum.next}}.take(100)
Run Code Online (Sandbox Code Playgroud)

无论如何,这个独白的好处是你可以学习多种迭代文件的方法.;)