2009-09-29 45 views
50

Tôi muốn đọc chỉ dòng đầu tiên của tệp bằng Ruby theo cách nhanh nhất, đơn giản và thành ngữ nhất có thể. Cách tiếp cận tốt nhất là gì?Đọc dòng đầu tiên của một tệp trong Ruby

(Cụ thể: Tôi muốn đọc git commit UUID trong tệp REVISION trong thư mục Rails Capistrano triển khai mới nhất của tôi và sau đó xuất kết quả đó vào thẻ của tôi. Điều này sẽ cho phép tôi xem phiên bản http là phiên bản nào triển khai tới máy chủ của tôi Nếu có một hoàn toàn khác nhau & tốt hơn cách để làm điều này, xin vui lòng cho tôi biết)

Trả lời

93

này sẽ đọc đúng một dòng và đảm bảo rằng tệp được đóng đúng cách ngay sau đó.

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

Bạn có thể thử này:..

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

LocalJumpError: no block given – klochner

+3

@klochner: Ruby của bạn cũ. Điều này hoạt động tốt trong 1.8.7 trở lên. – Chuck

+0

Xin lỗi Vincent, tôi không thể xóa bỏ ghi chú trừ khi bạn thực hiện một số chỉnh sửa nhỏ. – klochner

5

Làm thế nào để đọc những dòng đầu tiên trong tệp ruby:

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

Hoặc bạn chỉ có thể làm một git-log từ bên trong ứng dụng của bạn:

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

Các% H nói định dạng để in băm cam kết đầy đủ. Ngoài ra còn có các mô-đun cho phép bạn truy cập vào repo git địa phương của bạn từ bên trong một ứng dụng Rails một cách ruby-ish hơn mặc dù tôi chưa bao giờ sử dụng chúng.

+0

.last không hoạt động như tôi đã lên kế hoạch ở đây. Làm thế nào để làm điều này cho dòng cuối cùng? –

1

Tôi nghĩ rằng đề xuất jkupferman về điều tra các tùy chọn git --pretty có ý nghĩa nhất, tuy nhiên một cách tiếp cận khác sẽ là lệnh head ví dụ:

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

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

15

Đây là cách thành ngữ ngắn gọn để làm điều đó mở đúng tệp để đọc và đóng tệp sau đó.

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

Nếu bạn muốn tệp trống làm cho ngoại lệ sử dụng thay thế này.

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

Ngoài ra, đây là một cách nhanh chóng & thực hiện bẩn đầu rằng sẽ làm việc cho mục đích của bạn và trong nhiều trường hợp khác mà bạn muốn đọc một vài dòng hơn.

# 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

Thực hiện đơn giản: 'Tệp lớp; def self.head (đường dẫn, n = 1); foreach (đường dẫn) .first (n); kết thúc; end' –

+1

(6 năm sau ....) Điều gì đang xảy ra trong 2 ví dụ đầu tiên với biểu tượng là đối số thứ hai để mở? Tôi không thể tìm thấy bất kỳ tài liệu nào giải thích những gì đang làm. Thx cho bất kỳ thông tin ... – skydvr

2

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

+1

Mặc dù nó hoạt động, nhưng nó sẽ không tải toàn bộ tập tin trong bộ nhớ? – Saim

2

Cải thiện về câu trả lời đăng bởi @Chuck, tôi nghĩ rằng nó có thể là đáng giá để chỉ ra rằng nếu tập tin bạn đang đọc là trống rỗng, một ngoại lệ EOFError sẽ được ném ra. Nắm bắt và bỏ qua ngoại lệ:

def readit(filename) 
text = "" 
begin 
    text = File.open(filename, &:readline) 
rescue EOFError 
end 
text 
end 
Các vấn đề liên quan