2012-10-03 21 views
9

Tôi đã thực hiện một số thử nghiệm với CSV.table. Tôi có hai tệp CSV nhỏ và gần như giống hệt nhau, tuy nhiên một tệp thiếu hàng tiêu đề.Ruby 1.9.3 - Cách CSV.table biết nếu không có tiêu đề nào trong tệp CSV?

Khi tôi chạy CSV.table đối với tệp CSV có hàng tiêu đề, mọi thứ hoạt động như mong đợi.

Khi tôi chạy nó chống lại các tập tin CSV mà không có dòng tiêu đề tôi nhận được:

NoMethodError: undefined method `encode' for nil:NilClass 

Tôi cố gắng này với các loại dữ liệu khác nhau, với các loại khác nhau của tiêu đề, và nhận được kết quả tương tự.

Tôi tò mò về sự kỳ diệu của CSV.table. Nếu tôi sử dụng CSV.parse với tiêu đề được đặt thành true, thì nó luôn làm cho hàng đầu tiên là tiêu đề không có vấn đề gì. Vì vậy, tôi đã sử dụng CSV.table để kiểm tra xem tệp CSV được nhập có hàng tiêu đề hay không nhưng tôi không quá thoải mái với điều này vì tôi không hiểu liệu có hay không khi nào hoặc sẽ không hoạt động theo cách tôi đang sử dụng.

begin 
    CSV.table(csv_file_path) 
rescue 
    # Add error to log or something. 
end 

Có ai biết không?

P.S. Tôi đã đọc qua điều này và mã nguồn mà nó cung cấp trên mỗi phương thức - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

Trả lời

9

Không có bất kỳ ma thuật nào liên quan, và nó sẽ không hiệu quả cho bạn nói chung.

Như bạn có thể thấy from the source, table theo nghĩa đen chỉ cần gọi read với headers: true. Nhưng nó cũng chuyển đổi tiêu đề thành các ký hiệu (header_converters: :symbol) và đây là chìa khóa để giải thích tại sao nó hoạt động.

Bạn gặp lỗi không có tiêu đề vì bạn có cột trống trong hàng dữ liệu đầu tiên của bạn (giống như a,b,,d,e). Trống được đọc ở dạng nil và không thể chuyển đổi từ nil thành biểu tượng, nó sẽ thổi lên.

Hãy thử với một số dữ liệu không có hàng trống ở hàng đầu tiên - bạn sẽ thấy rằng table sẽ xử lý hàng dữ liệu đó làm tiêu đề giống như bất kỳ phương pháp nào khác.

+0

Cảm ơn @ andy-h Tôi đã có một tình huống tương tự khi tôi chạy 'contents = CSV.open" languages.csv ", tiêu đề: true, header_converters:: symbol' Tôi gặp lỗi này: 'undefined method' encode 'for nil : NilClass (NoMethodError) '. Nó phàn nàn về phương thức 'header_converter:: symbol'. Sau khi xem lại tệp "languages.csv", tôi thấy tiêu đề của nó bắt đầu bằng dấu cách "". Loại bỏ không gian đó đã giải quyết vấn đề đó. – egyamado

+0

** Hiệu chỉnh. ** Ý tôi là tôi thiếu một dấu cách ở hàng đầu tiên '", tên, địa chỉ, .... "' khi tôi thêm khoảng trắng như vậy ", tên, địa chỉ, ...." Tôi đã có thể chạy mã của tôi. – egyamado

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