检查文件是否包含字符串

Dan*_*nny 35 ruby if-statement

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

if File.readlines("testfile.txt").grep(/monitor/)
  do something
end
Run Code Online (Sandbox Code Playgroud)

它应该是=="nil"吗?我对ruby很新,不知道输出会是什么.

the*_*Man 59

我会用:

if File.readlines("testfile.txt").grep(/monitor/).any?
Run Code Online (Sandbox Code Playgroud)

要么

if File.readlines("testfile.txt").any?{ |l| l['monitor'] }
Run Code Online (Sandbox Code Playgroud)

readlines虽然使用可扩展性问题,但它将整个文件读入数组.相反,foreach如果没有可伸缩性问题,使用将完成同样的事情:

if File.foreach("testfile.txt").grep(/monitor/).any?
Run Code Online (Sandbox Code Playgroud)

要么

if File.foreach("testfile.txt").any?{ |l| l['monitor'] }
Run Code Online (Sandbox Code Playgroud)

有关可伸缩性问题的更多信息,请参阅" 为什么"啜饮"文件不是一个好的做法? ".

  • 'any?'的+1,因为它会在找到第一个匹配后立即结束,而不是处理每一行只是为了查看是否匹配. (5认同)
  • 再次对`any?` 加上+1,不过为了快速澄清,一旦匹配就返回的方法是`any?{ ... }` 而不是 `grep(...).any?`。学到了这一点,应该密切关注:) (2认同)

Ed *_* S. 32

可枚举#grep不返回布尔值; 它返回一个数组(如何在不传递块的情况下访问匹配项?).

如果未找到匹配项,则返回空数组,并[]求值为true.您需要在if语句中检查数组的大小,即:

if File.readlines("testfile.txt").grep(/monitor/).size > 0
  # do something
end
Run Code Online (Sandbox Code Playgroud)

文档应该是您这样的问题的第一个资源.


ste*_*lag 6

Grep会给你一系列所有'监视器'.但是你不想要一个数组,你想要一个布尔值:这个文件中是否有'monitor'字符串?这个文件根据需要读取的文件很少:

if File.open('test.txt').lines.any?{|line| line.include?('monitor')}
  p 'do something'
end
Run Code Online (Sandbox Code Playgroud)

readlines读取整个文件,返回一个逐行执行的枚举器.