我想编写一个类,它可以在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 ......),则此方法的性能非常差。
有更好的解决方案吗?
答案 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