gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:49:36 24 4
gpt4 key购买 nike

我试着搜索这个,但找不到太多。这似乎是以前可能被问过的问题(很多次?),所以如果是这样,我深表歉意。

我想知道在 Ruby 中解析文件某些部分的最快方法是什么。例如,假设我知道我想要的某个特定函数的信息在第 500 到 600 行之间,比如说,一个 1000 行的文件。 (显然这种问题是针对大文件的,我只是为了举例而使用那些较小的数字),因为我知道它不会出现在上半年,有没有一种快速的方法来忽略这些信息?

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

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 的新手,有兴趣学习用它做事的新方法。

最佳答案

file.lines.drop(500).take(100) # will get you lines 501-600

通常,您无法避免从头开始读取文件,直到您感兴趣的行,因为每行的长度可能不同。不过,您可以避免的一件事是将整个文件加载到一个大数组中。只需逐行阅读、计数并丢弃它们,直到找到您要查找的内容。很像你自己的例子。你可以让它更像 Rubyish。

附言。铁皮人的评论让我做了一些实验。虽然我没有找到为什么 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)

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

关于ruby - 在 Ruby 中解析文件时跳过行的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com