在Rails中的CSV标题中将空格转换为下划线

时间:2016-02-29 02:07:49

标签: ruby-on-rails ruby csv hash

我正在尝试将CS​​V文件中的行上传到我的数据库中,但是标题中的空格一直让我感到烦恼。因此,例如,标题将是“订单商品ID”,我希望散列密钥为“order_item_id”。以下是我的代码现在的样子:

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

我尝试使用product_hash.keys.each {| k |编辑product_hash k =“...”}    但它没有做任何事情。我也尝试过创建一个类似于下行模式的标题转换器,但我也无法做到这一点。对不起,如果这是一个新问题,但我一直在寻找答案,但没有一个人为我工作。非常感谢!

4 个答案:

答案 0 :(得分:1)

您可以在:header_converters之后将替换后的替换连接起来,如下所示:

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

答案 1 :(得分:1)

试试这个:

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}

答案 2 :(得分:0)

如果您希望将包含空格的键转换为包含下划线的键的哈希,则可以执行以下操作

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"}

答案 3 :(得分:0)

万一其他人偶然发现了这个问题,可以使用:symbol header_converter

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

  

标头String转换为小写字母,下划线替换空格,删除非单词字符,最后调用to_sym()。

示例:

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