のみ Rubyを使用してファイルの最初の行をできるだけ速く、最も単純で、最も慣用的な方法で読みたい。最良のアプローチは何ですか?
(具体的には、最新のCapistrano-deployed RailsディレクトリにあるREVISIONファイルからgit commit UUIDを読み取り、それをタグに出力します。これにより、http -サーバーに展開されているバージョンを確認します。これとはまったく異なる、より良い方法があれば、教えてください。)
これにより、正確に1行が読み取られ、その直後にファイルが適切に閉じられるようになります。
strVar = File.open('somefile.txt') {|f| f.readline}
# or, in Ruby 1.8.7 and above: #
strVar = File.open('somefile.txt', &:readline)
puts strVar
読み取りのためにファイルを適切に開き、後で閉じるための簡潔で慣用的な方法を次に示します。
File.open('path.txt', &:gets)
空のファイルで例外を発生させたい場合は、代わりにこれを使用します。
File.open('path.txt', &:readline)
また、目的のために、そしてさらにいくつかの行を読みたい他の多くの場合に機能するheadの迅速で汚い実装があります。
# 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
これを試すことができます:
File.foreach('path_to_file').first
Rubyファイルの最初の行を読む方法:
commit_hash = File.open("filename.txt").first
または、アプリケーション内からgit-logを実行することもできます。
commit_hash = `git log -1 --pretty=format:"%H"`
%Hは、完全なコミットハッシュを出力するようフォーマットに指示します。 Railsアプリ内からローカルのgitリポジトリにアクセスすることができるモジュールもあります。これは私が使用したことはありませんが、Ruby風の方法です。
first_line = open("filename").gets
first_line = File.readlines('file_path').first.chomp
@Chuckが投稿した回答を改善して、読んでいるファイルが空の場合、EOFError例外がスローされることを指摘する価値があると思います。例外をキャッチして無視します。
def readit(filename)
text = ""
begin
text = File.open(filename, &:readline)
rescue EOFError
end
text
end
私はjkupfermanがgit --pretty
オプションは最も理にかなっていますが、さらに別のアプローチはhead
コマンドです。
Ruby -e 'puts `head -n 1 filename`' #(backtick before `head` and after `filename`)