web-dev-qa-db-ja.com

Rubyでファイルの最初の行を読み込む

のみ Rubyを使用してファイルの最初の行をできるだけ速く、最も単純で、最も慣用的な方法で読みたい。最良のアプローチは何ですか?

(具体的には、最新のCapistrano-deployed RailsディレクトリにあるREVISIONファイルからgit commit UUIDを読み取り、それをタグに出力します。これにより、http -サーバーに展開されているバージョンを確認します。これとはまったく異なる、より良い方法があれば、教えてください。)

58
Craig Walker

これにより、正確に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
103
Chuck

読み取りのためにファイルを適切に開き、後で閉じるための簡潔で慣用的な方法を次に示します。

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
17
Blake Taylor

これを試すことができます:

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

Rubyファイルの最初の行を読む方法:

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

または、アプリケーション内からgit-logを実行することもできます。

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

%Hは、完全なコミットハッシュを出力するようフォーマットに指示します。 Railsアプリ内からローカルのgitリポジトリにアクセスすることができるモジュールもあります。これは私が使用したことはありませんが、Ruby風の方法です。

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

@Chuckが投稿した回答を改善して、読んでいるファイルが空の場合、EOFError例外がスローされることを指摘する価値があると思います。例外をキャッチして無視します。

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

私はjkupfermanがgit --prettyオプションは最も理にかなっていますが、さらに別のアプローチはheadコマンドです。

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