2009-09-29 35 views
50

Quiero leer solo la primera línea de un archivo usando Ruby de la manera más rápida, simple e idiomática posible. ¿Cuál es el mejor enfoque?Leyendo la primera línea de un archivo en Ruby

(Específicamente: deseo leer el UTI del git commit fuera del archivo REVISION en mi último directorio de Rails implementado por Capistrano, y luego enviarlo a mi etiqueta. Esto me permitirá ver en un http-vistazo qué versión es desplegados en mi servidor Si hay un tipo completamente diferente & mejor manera de hacer esto, por favor hágamelo saber)

Respuesta

93

esto leerá exactamente una línea y garantizar que el archivo se cierra correctamente inmediatamente después.

File.open('somefile.txt') {|f| f.readline} 
# or, in Ruby 1.8.7 and above: # 
File.open('somefile.txt', &:readline) 
3
first_line = open("filename").gets 
7

Usted puede intentar esto:..

File.foreach('path_to_file').first 
+0

LocalJumpError: no determinado bloque – klochner

+3

@klochner: Su Ruby es vieja. Esto funciona bien en 1.8.7 y superior. – Chuck

+0

Lo siento Vincent, no puedo eliminar el voto a menos que hagas una edición menor. – klochner

5

Cómo leer la primera línea de un archivo de rubí:

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

Alternativamente usted podría hacer un git-log desde el interior de su aplicación:

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

El% de H dice el formato para imprimir el hash de confirmación completo. También hay módulos que te permiten acceder a tu repositorio de git local desde dentro de la aplicación de Rails de una manera más rubí, aunque nunca los he usado.

+0

.last no está funcionando como lo planeé aquí. ¿Cómo hago esto para la última línea? –

1

Creo que la sugerencia de jkupferman de investigar las opciones git --pretty tiene más sentido, sin embargo, otro enfoque sería el comando head, p.

ruby -e 'puts `head -n 1 filename`' #(backtick before `head` and after `filename`) 
+0

https://gist.github.com/784711 – maletor

15

Aquí está una manera concisa idiomática para hacerlo que se abre correctamente el archivo para la lectura y la cierra después.

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

Si desea que un archivo vacío cause una excepción, utilice esto en su lugar.

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

También, he aquí una rápida aplicación & sucio de la cabeza que funcione para sus propósitos y en muchos otros casos en los que desea leer unas cuantas más líneas.

# 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

Implementación más simple: 'class File; def self.head (ruta, n = 1); foreach (ruta) .primero (n); fin; end' –

+1

(6 años después ....) ¿Qué está sucediendo en esos primeros 2 ejemplos con el símbolo como segundo argumento para abrir? No puedo encontrar ningún documento que explique lo que está haciendo. Thx para cualquier información ... – skydvr

2

first_line = File.readlines('file_path').first.chomp

+1

Aunque funciona, ¿pero no cargará todo el archivo en la memoria? – Saim

2

La mejora en la respuesta Publicado por @Chuck, creo que valdría la pena señalar que si el archivo que está leyendo está vacía, una excepción EOFError será lanzada. Coger y pasar por alto la excepción:

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