所以我在这里找到了这个问题,但我遇到输出问题以及如何用if语句处理它。这就是我所拥有的,但它总是说即使文件中不存在文字监视器也是如此
if File.readlines("testfile.txt").grep(/monitor/)
do something
end
应该是==“nil”吗?我对ruby很新,不知道输出会是什么。
答案 0 :(得分:59)
我会用:
if File.readlines("testfile.txt").grep(/monitor/).any?
或
if File.readlines("testfile.txt").any?{ |l| l['monitor'] }
使用readlines
时会出现可伸缩性问题,因为它会将整个文件读入数组。相反,如果没有可伸缩性问题,使用foreach
将完成同样的事情:
if File.foreach("testfile.txt").grep(/monitor/).any?
或
if File.foreach("testfile.txt").any?{ |l| l['monitor'] }
有关可伸缩性问题的详细信息,请参阅“Why is "slurping" a file not a good practice?”。
答案 1 :(得分:31)
Enumerable#grep不返回布尔值;它返回一个数组(如何在不传递块的情况下访问匹配项?)。
如果未找到匹配项,则返回空数组,[]
计算结果为true
。您需要在if
语句中检查数组的大小,即:
if File.readlines("testfile.txt").grep(/monitor/).size > 0
# do something
end
文档应该是您提供此类问题的第一个资源。
答案 2 :(得分:6)
Grep将为您提供一系列所有'监视器'。但是你不想要一个数组,你想要一个布尔值:这个文件中是否有'monitor'字符串? 这个文件根据需要读取的文件很少:
if File.open('test.txt').lines.any?{|line| line.include?('monitor')}
p 'do something'
end
readlines 读取整个文件, lines 返回一个逐行执行的枚举器。
答案 3 :(得分:0)
如果有人正在寻找显示该字符串出现的文件最后一行的解决方案,那就
File.readlines('dir/testfile.txt').select{|l| l.match /monitor/}.last
示例强>
文件:
monitor 1
monitor 2
something else
你会得到
monitor 2