2016-02-29 41 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' –