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.
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.
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é.
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.
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