将包含头字段的CSV文件parsing为每行的属性

我想parsing一个CSV文件,以便每一行被视为一个对象,其中标题行是对象中属性的名称。 我可以写这个,但我确定它已经在那里了。

这是我的CSVinput:

"foo","bar","baz" 1,2,3 "blah",7,"blam" 4,5,6 

代码看起来像这样:

 CSV.open('my_file.csv','r') do |csv_obj| puts csv_obj.foo #prints 1 the 1st time, "blah" 2nd time, etc puts csv.bar #prints 2 the first time, 7 the 2nd time, etc end 

与Ruby的CSV模块,我相信我只能通过索引访问字段。 我认为上面的代码会更具可读性。 有任何想法吗?

使用Ruby 1.9及以上版本,你可以得到一个可索引对象:

 CSV.foreach('my_file.csv', :headers => true) do |row| puts row['foo'] # prints 1 the 1st time, "blah" 2nd time, etc puts row['bar'] # prints 2 the first time, 7 the 2nd time, etc end 

这不是点语法,但比数字索引更好用。

另外,对于Ruby 1.8.x来说, FasterCSV就是你需要使用上面的语法。

这是一个使用Ruby 1.9的符号语法的例子。 在下面的例子中,代码从Rails db目录读取一个名为data.csv的CSV文件。

:headers => true将第一行视为标题而不是数据行。 :header_converters => :symbolize参数,然后将标题行中的每个单元格转换为Ruby符号。

 CSV.foreach("#{Rails.root}/db/data.csv", {:headers => true, :header_converters => :symbol}) do |row| puts "#{row[:foo]},#{row[:bar]},#{row[:baz]}" end 

在Ruby 1.8中:

 require 'fastercsv' CSV.foreach("#{Rails.root}/db/data.csv", {:headers => true, :header_converters => :symbol}) do |row| puts "#{row[:foo]},#{row[:bar]},#{row[:baz]}" end 

基于Poul(StackOverflow asker)提供的CSV,上面示例代码的输出将是:

 1,2,3 blah,7,blam 4,5,6 

根据CSV文件标题中使用的字符,可能需要输出标题以查看CSV(FasterCSV)如何将string标题转换为符号。 您可以从CSV.foreach输出标题数组。

 row.headers 

尽pipe讨论的时间已经很晚了,几个月前,我在https://github.com/vicentereig/virgola开始了一个“CSV to object mapper”。

给定您的CSV内容,将它们映射到FooBar对象的数组非常简单:

 "foo","bar","baz" 1,2,3 "blah",7,"blam" 4,5,6 
 require 'virgola' class FooBar include Virgola attribute :foo attribute :bar attribute :baz end csv = <<CSV "foo","bar","baz" 1,2,3 "blah",7,"blam" 4,5,6 CSV foo_bars = FooBar.parse(csv).all foo_bars.each { |foo_bar| puts foo_bar.foo, foo_bar.bar, foo_bar.baz } 

在Ruby 2.3中容易得到一个散列:

 CSV.foreach('my_file.csv', headers: true, header_converters: :symbol) do |row| puts row.to_h[:foo] puts row.to_h[:bar] end 

由于我用一些频率来打这个问题:

 array_of_hashmaps = CSV.read("path/to/file.csv", headers: true) puts array_of_hashmaps.first["foo"] # 1 

这是非阻塞版本,当你想啜泣整个文件。