检查文件是否包含字符串

时间:2011-12-06 23:27:35

标签: ruby if-statement

所以我在这里找到了这个问题,但我遇到输出问题以及如何用if语句处理它。这就是我所拥有的,但它总是说即使文件中不存在文字监视器也是如此

if File.readlines("testfile.txt").grep(/monitor/)
  do something
end

应该是==“nil”吗?我对ruby很新,不知道输出会是什么。

4 个答案:

答案 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