2009-09-29 3 views
50

Я хочу только Первая строка файла с использованием Ruby в самом быстром, простейшем, наиболее идиоматическом виде. Какой лучший подход?Чтение первой строки файла в Ruby

(В частности: Я хочу прочитать git commit UUID из файла REVISION в моем последнем каталоге Rails, находящемся в каталоге Capistrano, а затем вывести его в мой тег. Это позволит мне увидеть на http-взгляд какую версию развернуты на моем сервере Если есть совершенно другой & лучший способ сделать это, пожалуйста, дайте мне знать)

ответ

93

Это будет читать ровно одну строку и обеспечить что файл правильно закрыт сразу после.

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

Вы можете попробовать это:..

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

LocalJumpError: нет блок дал – klochner

+3

@klochner: Ваш рубин старый. Это отлично работает в 1.8.7 и выше. – Chuck

+0

Извините, Винсент, я не могу удалить downvote, если вы не сделаете небольшое редактирование. – klochner

5

Как прочитать первую строку в файле рубина:

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

В качестве альтернативы вы можете просто сделать ГИТ-журнал внутри приложения:

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

Значение% H говорит формат для печати полного хэша commit. Существуют также модули, которые позволяют вам получить доступ к локальному репозиторию git изнутри приложения Rails в более рубиновом режиме, хотя я никогда не использовал их.

+0

.область не работает, как я и планировал здесь. Как это сделать для последней строки? –

1

Я думаю, что предложение jkupferman по исследованию опций git --pretty имеет наибольший смысл, однако еще одним подходом будет команда head, например.

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

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

15

Вот краткий идиоматический способ сделать это, чтобы правильно открыть файл для чтения и закрыть его впоследствии.

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

Если вы хотите, чтобы пустой файл вызывал исключение, используйте это вместо этого.

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

Кроме того, вот быстрый & грязной реализации головы, которая будет работать для ваших целей и во многих других случаях, когда вы хотите, чтобы прочитать несколько строк.

# 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

Упрощенная реализация: 'class File; def self.head (путь, n = 1); Еогеасп (путь) .first (п); конец; end' –

+1

(6 лет спустя ....) Что происходит в этих первых двух примерах с символом в качестве второго аргумента для открытия? Я не могу найти какой-либо документ, который объясняет, что это делает. Thx для любой информации ... – skydvr

2

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

+1

Хотя он работает, но не будет ли он загружать весь файл в память? – Saim

2

Улучшение на ответ разместил @Chuck, я думаю, что это может быть, стоит отметить, что, если файл, который вы читаете пуст, исключение EOFError будет отброшена. не поймать и игнорировать исключение:

def readit(filename) 
text = "" 
begin 
    text = File.open(filename, &:readline) 
rescue EOFError 
end 
text 
end 
Смежные вопросы