web-dev-qa-db-fra.com

Vérifier si le fichier contient une chaîne

Donc, j'ai trouvé cette question ici, mais j'ai un problème avec la sortie et comment le gérer avec une instruction if. C’est ce que j’ai, mais on dit toujours que c’est vrai même si le moniteur Word n’existe pas dans le fichier

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

Devrait-il y avoir quelque chose comme == "nil"? Je suis assez nouveau pour Ruby et je ne suis pas sûr de ce que seraient les résultats.

33
Danny

Enumerable # grep ne renvoie pas de booléen; il retourne un tableau (comment auriez-vous accès aux correspondances sans passer un bloc sinon?). 

Si aucune correspondance n'est trouvée, un tableau vide est renvoyé et [] est évalué à true. Vous devez vérifier la taille du tableau dans l'instruction if, c'est-à-dire:

if File.readlines("testfile.txt").grep(/monitor/).size > 0
  # do something
end

La documentation devrait être votre première ressource pour des questions comme celle-ci.

28
Ed S.

J'utiliserais:

if File.readlines("testfile.txt").grep(/monitor/).any?

ou 

if File.readlines("testfile.txt").any?{ |l| l['monitor'] }

L'utilisation de readlines pose des problèmes d'évolutivité, car elle lit l'intégralité du fichier dans un tableau. Utiliser plutôt foreach accomplira la même chose sans le problème d’évolutivité:

if File.foreach("testfile.txt").grep(/monitor/).any?

ou 

if File.foreach("testfile.txt").any?{ |l| l['monitor'] }

Voir " Pourquoi" extraire "un fichier n'est pas une bonne pratique? " pour plus d'informations sur les problèmes d'évolutivité.

57
the Tin Man

Grep vous donnera un tableau de tous les "moniteurs" trouvés. Mais vous ne voulez pas d'un tableau, vous voulez un booléen: y a-t-il une chaîne 'moniteur' dans ce fichier? 

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

readlines lit l'intégralité du fichier, lines renvoie un énumérateur qui le fait ligne par ligne. 

6
steenslag

si quelqu'un recherche une solution pour afficher la dernière ligne d'un fichier contenant cette chaîne, 

File.readlines('dir/testfile.txt').select{|l| l.match /monitor/}.last 

Exemple

fichier: 

monitor 1
monitor 2
something else

tu auras 

monitor 2
0
equivalent8