从大文件中查找目标字符串

时间:2014-08-24 04:57:44

标签: ruby performance

我想编写一个类,它可以在txt文件中找到目标字符串并输出行号和位置。

class ReadFile

    def find_string(filename, string)
        line_num = 0
        IO.readlines(filename).each do |line|
            line_num += 1
            if line.include?(string)
                puts line_num
                puts line.index(string)
            end
        end
    end

end

a= ReadFile.new
a.find_string('test.txt', "abc")

如果txt文件非常大(1 GB,10GB ......),则此方法的性能非常差。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

使用foreach一次有效地从文件中读取一行,with_index跟踪行号(从0开始):

IO.foreach(filename).with_index do |line, index|
  if found = line.index(string)
    puts "#{index+1}, #{found+1}"
    break  # skip this if you want to find more than 1 result
  end
end

请参阅here,了解readlines为什么会给您带来性能问题。

答案 1 :(得分:1)

这是@PinnyM的答案的变体。它使用find,我认为它比循环和破坏更具描述性,但做同样的事情。这确实有一个小的代价,即必须确定在找到该行之后字符串开始的行的偏移​​量。

line, index = IO.foreach(filename).with_index.find { |line,index|
                line.include?(string) }
if line
  puts "'#{string}' found in line #{index}, " +
         "beginning in column #{line.index(string)+1}"
else
  puts "'#{string}' not found"
end