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

Ruby on rails 在Rails的CSV标题中将空格转换为下划线,ruby-on-rails,ruby,csv,hash,Ruby On Rails,Ruby,Csv,Hash,我正试图将CSV文件中的行上传到我的数据库中,但标题中的空格一直让我感到困惑。例如,标题将是“订单项目Id”,我希望哈希键是“订单项目Id”。下面是我的代码现在的样子: CSV.foreach(file.path, headers:true, :header_converters => lambda { |h| h.try(:downcase) }, col_sep: ';') do |row| product_hash = row.to_hash product = Orde

我正试图将CSV文件中的行上传到我的数据库中,但标题中的空格一直让我感到困惑。例如,标题将是“订单项目Id”,我希望哈希键是“订单项目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 | k=“…”}编辑product_hash
但它什么也没用。我也尝试过创建一个标题转换器,就像做下套管的一样,但我也没能做到。如果这是一个新问题,很抱歉,但我一直在到处寻找答案,但没有一个是为我工作的。非常感谢

您可以在停机后的
:header\u converters
中连接替换,如下所示:

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

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

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"}
试试这个:

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}

如果其他人偶然发现这个问题,您可以使用
:symbol
标题\u转换器

标题字符串的大小写是向下的,空格替换为下划线,非单词字符被删除,最后调用to_sym()

示例:

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

您还可以使用修饰符
if
而不是
try
链,即
h.downcase.gsub('''''.'''.')if h
或者甚至
h.to_.downcase.gsub(''.'''.''.
如果一个空的头是可以的。所以我使用了它,它也可以工作,但现在我在尝试上传文件时遇到了一个“UTF-8中的无效字节序列”错误。结果是仅从文件上载第一行。这是否可能会影响回车/换行?我以前从未遇到过这些错误,我不认为你的问题与新代码有关,很可能是文件有问题,你以前没有看到过,因为它没有走到这一步(因为标题有问题)。可能,我可以通过使用:encoding=>'ISO-8859-1'将其显式编码为UTF-8来修复此问题。不过,在进行此更改之前,我从未遇到过此问题,并且我可以通过手动删除标题中的空格来上载所有数据。这也很有效,谢谢。但是,它会导致与CSV头代码相同的“UTF-8中的无效字节序列”错误。用下划线替换标题中的所有空格会干扰到下一行的功能-现在只上载文件的第一行。对于正在阅读此文件并且在进行此更改后碰巧遇到UTF-8错误的任何人,我通过使用以下代码将其编码为UTF-8来修复:encoding=>'ISO-8859-1'