在Ruby中解析文件时跳过行的最快方法?
我试着寻找这个,但找不到多少。 这似乎是之前可能会被问过的事情(很多次?),所以如果是这样我会道歉。
我想知道在Ruby中解析文件某些部分的最快方法是什么。 例如,假设我知道我想要的特定function的信息是在1000行文件的第500行和第600行之间。 (显然这类问题适用于大型文件,我只是为了举例而使用那些较小的数字),因为我知道它不会在上半部分,是否有一种忽略这些信息的快速方法?
目前我正在使用以下内容:
while buffer = file_in.gets and file_in.lineno 500 if buffer.chomp!.include? some_string do_func_whatever end end
它有效,但我不禁认为它可以更好地工作。
我是Ruby的新手,并且有兴趣学习新的工作方式。
file.lines.drop(500).take(100) # will get you lines 501-600
通常,您无法避免从开始读取文件直到您感兴趣的行,因为每行可以具有不同的长度。 但是,您可以避免的一件事是将整个文件加载到一个大数组中。 只需逐行阅读,计算并丢弃它们,直到达到你想要的效果。 非常像你自己的例子。 你可以把它变得更加Rubyish。
PS。 Tin Man的评论让我做了一些实验。 虽然我没有找到任何理由为什么会drop
加载整个文件,但确实存在一个问题: drop
返回数组中文件的其余部分。 这是一种可以避免的方法:
file.lines.select.with_index{|l,i| (501..600) === i}
PS2:Doh,上面的代码,虽然不是一个巨大的数组,迭代整个文件,甚至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)
无论如何,这个独白的好处是你可以学习多种迭代文件的方法。 ;)
我不知道对于行是否有相同的方法,但您可以在IO对象上使用seek
或offset
参数来“跳过”字节。
有关偏移量参数的信息,请参阅IO#seek ,或参见IO#open 。
听起来像里奥可能在这里有所帮助。 它为您提供了lines()
方法。
您可以使用IO#readlines ,它返回包含所有行的数组
IO.readlines(file_in)[500..600].each do |line| #line is each line in the file (including the last \n) #stuff end
要么
f = File.new(file_in) f.readlines[500..600].each do |line| #line is each line in the file (including the last \n) #stuff end