我尝试寻找这个,但找不到太多。这似乎是以前可能被问过的问题(很多次?),所以如果是这样的话,我深表歉意。
我想知道在 Ruby 中解析文件某些部分的最快方法是什么。例如,假设我know我想要的特定函数的信息位于 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
它确实有效,但我就是忍不住认为它可以更好地工作。
我对 Ruby 很陌生,并且有兴趣学习用 Ruby 做事的新方法。
file.lines.drop(500).take(100) # will get you lines 501-600
通常,您无法避免从头开始读取文件直到您感兴趣的行,因为每行的长度都可以不同。不过,您可以避免的一件事是将整个文件加载到一个大数组中。只需逐行阅读,数数,然后丢弃它们,直到找到您想要的内容。很像你自己的例子。你可以让它变得更加Rubyish。
附言。铁皮人的评论让我做了一些实验。虽然我没有找到任何理由drop
加载整个文件,确实有问题:drop
returns文件的其余部分在数组中。这是可以避免这种情况的方法:
file.lines.select.with_index{|l,i| (501..600) === i}
PS2:哦,上面的代码虽然没有创建一个巨大的数组,但会迭代整个文件,甚至是 600 以下的行。:( 这是第三个版本:
enum = file.lines
500.times{enum.next} # skip 500
enum.take(100) # take the next 100
或者,如果您更喜欢 FP:
file.lines.tap{|enum| 500.times{enum.next}}.take(100)
不管怎样,这段独白的好处是你可以学习多种迭代文件的方法。 ;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)