从 CSV 更新列
Posted
技术标签:
【中文标题】从 CSV 更新列【英文标题】:Update columns from a CSV 【发布时间】:2016-04-09 13:18:07 【问题描述】:我有以下代码,它应该使用 CSV 文件每一行的属性更新我的 Rental 模型中的每一行。数据库中 ID 为 1 的行应使用 CSV 等中第 1 行的值更新其属性……我在表中有 10000 行,在 CSV 中有 10000(不包括标题)。
但是,它不是更新模型中 id = row 的属性,而是使用 CSV 的第一行更新表中的所有行属性,然后是第二行等...
任何帮助将不胜感激!
csv_text = File.read(Rails.root.join('db', 'Lpostcodes.csv'))
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
postcode = row['postcode']
latitude = row['latitude']
longitude = row['longitude']
puts $INPUT_LINE_NUMBER
#update a particular row
Rental.update($INPUT_LINE_NUMBER, postcode: postcode, latitude: latitude,
longitude: longitude)
end
【问题讨论】:
【参考方案1】:我实际上无法解释为什么你会看到你所看到的,我原以为你看到的实际结果会是你的数据库中只有一行被更新一遍又一遍地处理 CSV 中的每一行。
我也很惊讶,在您的循环中使用 puts $INPUT_LINE_NUMBER
,您没有看到我所期望的(一遍又一遍地打印一个数字)。
这是因为 $INPUT_LINE_NUMBER
不是在 Rails 中的每个 each
中自动设置的,它甚至不是由 File.read
设置的,所以在你的代码中它将是最后一个 @ 末尾的任何内容987654325@循环。
解决此问题的最简单方法是使用循环索引作为您的 id,而不是尝试使用行号,因此请使用 csv.each
代替 csv.each_with_index
:
csv.each_with_index do |row, i|
postcode = row['postcode']
latitude = row['latitude']
longitude = row['longitude']
Rental.update(i, postcode: postcode, latitude: latitude,
longitude: longitude)
end
【讨论】:
以上是关于从 CSV 更新列的主要内容,如果未能解决你的问题,请参考以下文章