2010-07-25 27 views
54

Có chức năng trong xây dựng trong Ruby để đọc toàn bộ tập tin mà không sử dụng bất kỳ vòng lặp nào không? Cho đến nay, tôi đã chỉ đi qua các phương pháp mà đọc trong khối (dòng hoặc ký tự).Làm thế nào để đọc toàn bộ tập tin trong Ruby?

+3

Đối với những gì đáng giá, đây là điều mà mọi người thường muốn nhưng không thực sự cần. (Và nếu tập tin là rất lớn, bạn có thể nhận được một bất ngờ khó chịu khi tập tin slurping gobbles gần tất cả bộ nhớ có sẵn của bạn.) Cuối cùng bạn đang cố gắng để thực hiện là gì? – Telemachus

+0

Tôi thấy điều này rất hữu ích khi làm việc với một tệp không có định dạng hàng ngày. Tôi đã đọc một tập tin trong IBM437 mã hóa và cần thiết để phá vỡ các tập tin tại các nhân vật kỳ quặc, để tách các dữ liệu có giá trị từ những thứ tôi không cần. Cho rằng nó có ý nghĩa để đọc toàn bộ tập tin và sau đó tạo ra các ngắt dòng của riêng tôi, nơi họ nên được. Nếu không tôi sẽ đi qua mỗi dòng hoặc mỗi nhân vật. Thay vào đó, tôi có thể sử dụng đơn giản này để đọc tệp và sau đó sử dụng tính năng chia tách để tách tệp tại chuỗi ký tự có thể in và sau đó sử dụng khối để xác định tập hợp dữ liệu tôi cần. – ndw

+0

Tôi khuyên bạn nên đọc http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad. –

Trả lời

78
IO.read("filename") 

hoặc

File.read("filename") 
+3

Documents: http://ruby-doc.org/core/classes/IO.html – quantumSoup

+0

Chỉ cần tò mò, tại sao tôi không thể tìm thấy chức năng này ở đây: http://www.ruby-doc.org/core- 2.1.2/File.html –

+4

@MartinKonecny ​​vì 'File :: read' thực sự được kế thừa từ' IO :: read' - cả hai đều giống hệt nhau vì 'File' mở rộng' IO'. –

18
File.readlines("filename") 

Đây cũng là một phương pháp tuyệt vời để đọc tất cả mọi thứ từ một tập tin và phá vỡ phân chia trên xuống dòng. Sự trở lại là một mảng với một dòng cho mỗi phần tử.

+10

Cụ thể hơn, 'readlines' chia thành biến nội bộ' $/', mặc định là" \ n ". Bạn có thể tạm thời đặt lại '$ /', tuy nhiên, và đọc các tệp thành các phần được giới hạn theo các cách khác. – Telemachus

5

Vui lòng bỏ qua lời khuyên cho biết "Bạn không bao giờ nên slurp (đó là thuật ngữ gây phiền nhiễu cho điều này) một tệp". Đôi khi đây là một điều rất hữu ích và hợp lý để làm.

Giả sử bạn đang đọc tệp nhiều lần: cơ hội tốt để đọc tệp vào mảng là một tối ưu hóa hợp lý khi đọc từng dòng tệp, thậm chí có tính đến việc o/s sẽ lưu tệp.

+1

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và sau khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). - [Từ đánh giá] (/ review/low-quality-posts/10916920) – ndn

+1

Xin lỗi, nhưng đơn giản là không quan tâm đến việc làm việc cho một đại diện. Những lời khuyên để "không slurp" chỉ là đồng bằng sai. Đôi khi nó là một kỹ thuật hữu ích (tôi vừa giảm thời gian chạy của một chương trình theo hệ số 1000 bằng cách đọc toàn bộ tập tin), và không nên bị phản đối. –

+0

Đọc một tập tin vào bộ nhớ trong một lần (slurping) không phải là nhanh hơn so với từng dòng một khi tệp đạt kích thước 1MB +. Ngoài ra, bạn có thể đọc từng dòng nhanh hơn và tránh các vấn đề về khả năng mở rộng tiềm năng. "chỉ đơn giản là sai" là không hữu ích nếu không giải thích khi nào là thích hợp. Xem http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad để biết thêm thông tin. –

Các vấn đề liên quan