2016-02-29 2 views
0

Я пытаюсь загрузить строки из файла CSV в мою базу данных, но пробелы в заголовках продолжают меня путать. Например, заголовок будет «Идентификатор элемента заказа», и я хочу, чтобы хеш-ключ был «order_item_id». Вот что мой код выглядит сейчас:Перемещение пробелов в символах подчеркивания в заголовках CSV в Rails

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 = "..."} , но он ничего не делает. Я также попытался создать конвертер заголовков, как тот, который делает downcasing, но я тоже не смог выполнить эту работу. Извините, если это новый вопрос, но я везде искал ответ, и никто из них не работал на меня. Большое спасибо!

ответ

1

Вы можете сцепить замену после downcase, в :header_converters, как это:

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

Вы также можете использовать модификатор 'if' вместо из цепочки 'try', то есть' 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

Это также работает, спасибо. Тем не менее, он вызывает ту же ошибку «неправильная последовательность байтов в UTF-8», которую вызывает код заголовка CSV. Что-то о замене всех пробелов в заголовке символами подчеркивания связано с возможностью перехода к следующей строке - теперь загружается только первая строка файла. –

+0

Для тех, кто читает это и происходит с ошибкой UTF-8 после создания это изменение, я исправил его, кодируя UTF-8 с помощью: encoding => 'ISO-8859-1' –

Смежные вопросы