gpt4 book ai didi

ruby-on-rails - 如何仅将 csv 中的几列插入表中

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:24 28 4
gpt4 key购买 nike

我有一个包含以下标题行的大型 .csv 文件:

:headers => 
["_id_", "name", "ascii_names", "alternate_name", "latitute",
"longitude", "feature_class", "feature_code", "country_code", "cc2",
"admin_code_1", "admin_code_2", "admin_code_3", "admin_code_4", "population",
"elevation", "dem", "timezone", "modification_date"]}

我有一个表,其中只有 name, country_code, timezone 列。我只想将 .csv 文件的那 3 列插入表中。

我尝试过的:

CSV.foreach(csv_file, {:col_sep => "\t", :quote_char => '&', :write_headers => true, :headers => ["_id_", "name", "ascii_names", "alternate_name", "latitute", "longitude", "feature_class", "feature_code", "country_code", "cc2", "admin_code_1", "admin_code_2", "admin_code_3", "admin_code_4", "population", "elevation", "dem", "timezone", "modification_date"]}
) do |row|
City.create row.to_hash.values_at(:name, :timezone, :country_code)
binding.pry
end

问题是当我在运行它之后检查表时,没有任何值被填充。行本身已经创建,但它们都是空的。

如何正确映射这些,以便 .create() 知道哪些列与表匹配?

最佳答案

您需要先选择是否要将列标题标识为字符串或符号。在您的 headers => ["_id_"...] 中,您将它们声明为 Strings,但在您的 row.to_hash.values_at(:name, ...),您正在寻找 Symbols。 -感谢@mu

其次,您可以手动指定要插入表中的值,而无需对它们进行哈希处理,就像您在其他任何时间通过 Ruby 创建新条目时一样。

City.create(:name => row[:name], :timezone => row[:timezone], :country_code => row[:country_code])

总而言之,您的方法应如下所示:

  CSV.foreach(csv_file, {:col_sep => "\t", :quote_char => '&', #:write_headers => true, 
:headers => [:geonameid, :name, :ascii_names, :alternate_name, :latitute, :longitude, :feature_class, :feature_code, :country_code, :cc2, :admin_code_1, :admin_code_2, :admin_code_3, :admin_code_4, :population, :elevation, :dem, :timezone, :modification_date]}
) do |row|
City.create(:name => row[:name], :timezone => row[:timezone], :country_code => row[:country_code])
end

关于ruby-on-rails - 如何仅将 csv 中的几列插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804017/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com