我正在尝试将CSV文件中的行上传到我的数据库中,但是标题中的空格一直让我感到烦恼。因此,例如,标题将是“订单商品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 =“...”} 但它没有做任何事情。我也尝试过创建一个类似于下行模式的标题转换器,但我也无法做到这一点。对不起,如果这是一个新问题,但我一直在寻找答案,但没有一个人为我工作。非常感谢!
答案 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