ruby-on-rails - ruby - 在CSV标题中,将空格转换成下划线

下面是我的代码的外观:


CSV.foreach(file.path, headers:true, :header_converters => lambda { |h| h.try(:downcase) }, col_sep: ';') do |row|


 product_hash = row.to_hash



 product = OrderCsv.where(id: product_hash["id"])



 if product.count ==1


 product.first.update_attributes(product_hash)


 else



 user.order_csvs.create!(product_hash)


 end



end



时间:

你可以在小写之后替换,在:header_converters中,如下所示:


lambda { |h| h.try(:downcase).try(:gsub,' ', '_') }



尝试这个:


product_hash = {"Order Item Id" => 2 }


product_hash = product_hash.each_with_object({}) do |(k, v), h|


 h[k.parameterize.underscore] = v


end


puts product_hash # {"order_item_id"=>2}




hash_with_spaces = {"order item id" => '1',"some other id" => '2'}


new_hash = hash_with_spaces.inject({}) do |h, (k, v)| 


 h[k.gsub(' ', '_')] = v ; h


end



new_hash


#=> {"order_item_id"=>"1","some_other_id"=>"2"}



如果遇到这个问题,你可以利用:symbol header_converter,

https://docs.ruby-lang.org/en/2.1.0/CSV.html#HeaderConverters

将头字符串小写,用下划线替换空格,删除非单词字符,最后调用to_sym ()。

示例:


CSV.foreach(csv_path, headers: true, header_converters: :symbol) do |row|


 # do stuff


end



...