从 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 更新列的主要内容,如果未能解决你的问题,请参考以下文章

当 csv 文件被额外的列扩展时更新数据模型

无法将 CSV 文件更新为 BQR

如何使用 CSVHelper 更新现有 CSV 文件中特定列中的值?

如何通过 CSV 为某些列更新数据库

更新 CSV 文件以删除第一个数字并在特定列中插入小数位

使用 CSVhelper 将单个列更新为先前编写的 CSV 文件。我有 Java 代码,但无法将其翻译成 C#