0

我需要能够将 CSV 中每一行的两列与我自己的数据库进行比较。

例如,一行如下所示:

Headers => "Zipcode", "HouseNumber"
Row 1   => "5435 ZX", "43"

首先,我需要根据邮政编码和门牌号在我自己的数据库中找到一家公司,如果返回 true,那么我需要导入该行中的其余列。我知道如何解决这个问题。

但是,我还需要能够跟踪导入的行,因为我需要将总记录分成小块,所以我需要在导入后的每一行中添加一个额外的字段。

总结一下:

在以下循环中导入后,如何向每一行添加一个额外的字段(“导入”):

CSV.foreach('reviews.csv', :headers => true) do |row|
   Review.create(row.to_hash)
end
4

2 回答 2

1

如果您能Review找到Company. 您必须对其进行清理以将其与companies表的正确属性名称匹配。

CSV.foreach('reviews.csv', :headers => true) do |row|
   Review.create(row.to_hash) if Company.where("Zipcode = ? and HouseNumber = ?", 
       row.Zipcode, row.HouseNumber)
end

要添加其他列,请添加到以下内容:

CSV.foreach('reviews.csv', :headers => true) do |row|
   if company = Company.where("Zipcode = ? and HouseNumber = ?", 
       row.Zipcode, row.HouseNumber)
   row[:imported] = true
   Review.create(row.to_hash) 
end

这假定该imported列存在于您的表中。

我认为我们可能需要更多信息才能为您提供更完整的答案,但这里的想法应该让您接近。

于 2012-05-18T22:46:18.587 回答
0

似乎最简单的做法是将“导入”状态保持在单独的哈希中,如下所示:

imported = {}
CSV.read('reviews.csv').each_with_index do |row, line|
  if <your condition> && !imported[line]
    # create model
    imported[line] = true
  end
end

然后只保留那个散列,直到你需要读取下一个块,然后重新运行。该&& !imported[line]位将阻止读取一行两次。

如果这不是您想要的,您需要稍微澄清一下您的问题。:-)

于 2012-05-19T01:32:25.400 回答