在ruby中多次读取/ greping文件

时间:2012-10-16 15:30:28

标签: ruby file

如何重置文件的“指针”而不重新打开它? (像C中的fseek?)

例如,我有一个文件,我想grep两个模式:

f=open('test') => #<File:test> 
f.grep(/llo/)  => ["Hello world\n"] 
f.grep(/wo/)   => [] 

是否可以在不重新打开文件的情况下重置f

注意:我不是在寻找解决方法;我可以自己思考一些;)。

2 个答案:

答案 0 :(得分:16)

使用rewind

将ios定位到输入的开头,将lineno重置为零。

f = File.new("testfile") 
f.readline   #=> "This is line one\n"
f.rewind     #=> 0 
f.lineno     #=> 0 
f.readline   #=> "This is line one\n"

答案 1 :(得分:4)

查看IO课程的ruby文档。要重置流:

f.pos = 0

f.seek 0

请注意,您也可以使用这些方法将流设置为任意字节位置,但如果文件包含多字节字符,请小心。

提示:File.ancestors将告诉您继承链,以便您可以查找可能实现您想要的方法(但有时您必须对单例方法和method_missing进行更高级的反射)。 / p>

更新:

megas'的答案可能更清晰,因为rewind也会重置linenogrep的输出不受lineno值的影响,但lineno除非重置,否则会越来越不准确。如果您不关心lineno,您可以安全地使用我们的任何一种解决方案。