web-dev-qa-db-fra.com

Lecture de la première ligne d'un fichier en Ruby

Je veux lire niquement la première ligne d'un fichier en utilisant Ruby de la manière la plus rapide, la plus simple et la plus idiomatique possible. Quelle est la meilleure approche?

(Plus précisément: je veux lire l'UUID git commit du fichier REVISION dans mon dernier répertoire Capistrano-deploy Rails, puis le publier sur ma balise. Cela me permettra de voir sur http -voir quelle version est déployée sur mon serveur. S'il y a une manière entièrement différente et meilleure de le faire, veuillez me le faire savoir.)

58
Craig Walker

Cela lira exactement une ligne et garantira que le fichier est correctement fermé immédiatement après.

strVar = File.open('somefile.txt') {|f| f.readline}
# or, in Ruby 1.8.7 and above: #
strVar = File.open('somefile.txt', &:readline)
puts strVar
103
Chuck

Voici une manière idiomatique concise de le faire qui ouvre correctement le fichier pour la lecture et le ferme ensuite.

File.open('path.txt', &:gets)

Si vous souhaitez qu'un fichier vide provoque une exception, utilisez-le à la place.

File.open('path.txt', &:readline)

En outre, voici une implémentation rapide et sale de head qui fonctionnerait pour vos besoins et dans de nombreux autres cas où vous souhaitez lire quelques lignes supplémentaires.

# Reads a set number of lines from the top.
# Usage: File.head('path.txt')
class File
  def self.head(path, n = 1)
     open(path) do |f|
        lines = []
        n.times do
          line = f.gets || break
          lines << line
        end
        lines
     end
  end
end
17
Blake Taylor

Vous pouvez essayer ceci:

File.foreach('path_to_file').first
7
Vincent

Comment lire la première ligne d'un fichier Ruby:

commit_hash = File.open("filename.txt").first

Alternativement, vous pouvez simplement faire un git-log depuis l'intérieur de votre application:

commit_hash = `git log -1 --pretty=format:"%H"`

Le% H indique au format d'imprimer le hachage de validation complet. Il existe également des modules qui vous permettent d'accéder à votre référentiel git local à partir d'une application Rails d'une manière plus Ruby-ish bien que je ne les ai jamais utilisés.

6
jkupferman
first_line = open("filename").gets
4
Jeremy Ruten
first_line = File.readlines('file_path').first.chomp
2
boblin

En améliorant la réponse publiée par @Chuck, je pense qu'il pourrait être utile de souligner que si le fichier que vous lisez est vide, une exception EOFError sera levée. Attrapez et ignorez l'exception:

def readit(filename)
 text = ""
 begin
   text = File.open(filename, &:readline)
 rescue EOFError
 end
 text
end
2
markeissler

Je pense que la suggestion de jkupferman d'enquêter sur le git --pretty les options sont les plus sensées, cependant une autre approche serait la commande head par exemple.

Ruby -e 'puts `head -n 1 filename`'  #(backtick before `head` and after `filename`)
2
Andy Atkinson