所以我有这段代码:
data = CSV.open(filename, headers: true, header_converters: :symbol)
@contents = data.map
文件名是文件的路径,指的是我计算机上的实际文件。
我的问题是我命名数据的 CSV 对象到底是什么?如何映射对象?
当我使用pry调试时,我看到这个:
[1] pry(#<Session>)> data
=> <#CSV io_type:File io_path:"./data/event_attendees.csv" encoding:UTF-8 lineno:2 col_sep:"," row_sep:"n" quote_char:""" headers:[:_, :regdate, :first_name, :last_name, :email_address, :homephone, :street, :city, :state, :zipcode]>
[2] pry(#<Session>)> row
CSV::Row _:"1" regdate:"11/12/08 10:47" first_name:"Allison" last_name:"Nguyen" email_address:"arannon@jumpstartlab.com" homephone:"6154385000" street:"3155 19th St NW" city:"Washington" state:"DC" zipcode:"20010"
因此,数据似乎指的是CSV对象而不是数组。行似乎引用了 CSV 对象的某些属性?
无论哪种方式,我以前从未在对象上看到过方法图。这是怎么回事?
map
适用于包含Enumerable
mixin的任何对象。为了使用Enumerable
,类需要提供each
- 这是所有其他好方法的基础。CSV
类的对象符合此模式,如该类的文档所示。
(它不将其直接推送到数组中的原因是,能够逐行读取输入文件,而不必在对其进行任何操作之前将整个内容存储在内存中,这很好。