69 votes

Lire la première ligne d'un fichier en Ruby

Je veux lire sólo 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 du commit git à partir du fichier REVISION dans mon dernier répertoire Rails déployé par Capistrano, et ensuite l'envoyer à mon tag. Cela me permettra de voir en un coup d'œil http quelle version est déployée sur mon serveur. S'il existe un moyen entièrement différent et meilleur de faire cela, faites-le moi savoir).

125voto

Chuck Points 138930

Cela permettra de lire exactement une ligne et de s'assurer 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

26voto

Blake Taylor Points 4297

Voici une façon idiomatique et concise de procéder qui ouvre correctement le fichier pour la lecture et le ferme ensuite.

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

Si vous voulez qu'un fichier vide provoque une exception, utilisez ceci à la place.

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

Voici également une implémentation rapide de head qui conviendrait à vos besoins et à 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

1 votes

Une mise en œuvre plus simple : class File; def self.head(path, n = 1); foreach(path).first(n); end; end

1 votes

(6 years later....) Que se passe-t-il dans ces 2 premiers exemples avec le symbole comme deuxième argument pour ouvrir ? Je ne trouve aucune documentation qui explique ce qui se passe. Merci pour toute information...

0 votes

7voto

Vincent Points 1973

Vous pouvez essayer ceci :

File.foreach('path_to_file').first

0 votes

LocalJumpError : aucun bloc donné

3 votes

@klochner : Votre Ruby est vieux. Cela fonctionne bien en 1.8.7 et plus.

0 votes

Désolé Vincent, je ne peux pas enlever le downvote à moins que vous ne fassiez une modification mineure.

6voto

jkupferman Points 512

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 votre application :

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

Le %H indique au format d'imprimer le hachage complet de la livraison. Il existe également des modules qui vous permettent d'accéder à votre dépôt git local à partir d'une application Rails d'une manière plus ruby-ish, mais je ne les ai jamais utilisés.

0 votes

.last ne fonctionne pas comme je l'avais prévu ici. Comment faire pour la dernière ligne ?

5voto

Jeremy Ruten Points 59989
first_line = open("filename").gets

0 votes

Cela fermera-t-il le dossier par la suite ?

0 votes

Je reçois également un avertissement de Rubocop Security pour l'utilisation de Kernal#open : rubocop.readthedocs.io/fr/latest/cops_security/#securityopen

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X