2016-02-29 55 views
0

我试图将CSV文件中的行上载到我的数据库中,但标头中的空格不断让我感到困惑。因此,例如,标题将是“Order Item Id”,我希望散列键为“order_item_id”。以下是我的代码现在的样子:将空格转换为Rails中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 

我试过编辑product_hash与product_hash.keys.each {| k | k =“...”} 但它没有做任何事情。我也尝试创建一个像downcasing那样的标题转换器,但是我也无法做到这一点。对不起,如果这是一个新问题,但我一直在寻找答案,他们都没有为我工作。非常感谢!

回答

1

您可以连接的downcase更换后,在:header_converters,就像这样:

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

你也可以使用一个修改'if'代替如果一个空的标题是''''''''''''''''h.downcase.gsub('','_')如果h'或甚至'h.to_s.downcase.gsub('','_')好的。 – Stefan

+0

所以我用这个,它的工作原理,但现在当我尝试上传文件时,我得到了一个“UTF-8无效的字节序列”错误。结果是只有第一行从文件上传。这有可能是与回车/新行搞乱了吗?我从来没有在 –

+0

之前得到过这些错误,我认为你的问题与新代码没有任何关系,很可能这是该文件的问题,之前你没有看到,因为它没有得到这么远(因为标题有问题)。 – taglia

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

这也适用,谢谢。但是,它会导致CSV头文件代码导致的相同“UTF-8中的无效字节序列”错误。有关使用下划线替换标题中的所有空格的操作与下一行的功能相混淆 - 它只是现在上载文件的第一行 –

+0

对于阅读此内容并正好在制作后出现UTF-8错误的任何人这个变化,我通过编码将其固定为UTF-8:encoding =>'ISO-8859-1' –