我需要能够将CSV中每行的两列与我自己的数据库进行比较。
例如,一行如下所示:
Headers => "Zipcode", "HouseNumber"
Row 1 => "5435 ZX", "43"
首先,我需要在我自己的数据库中找到一个基于zipcode和housenumber的公司,如果这返回true,那么我需要导入该行中的其余列。我知道如何解决这个问题。
但是,我还需要能够跟踪导入的行,因为我需要以小块的形式分割总记录,所以我需要在导入后为每一行添加一个额外的字段。
总结:
如何在以下循环中导入后向每一行添加额外字段(“已导入”):
CSV.foreach('reviews.csv', :headers => true) do |row|
Review.create(row.to_hash)
end
答案 0 :(得分: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
列。
我认为我们可能需要更多信息来为您提供更完整的答案,但这里的想法应该会让您接近。
答案 1 :(得分: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]
位将阻止两次读取行。
如果那不是你想要的,你需要澄清一下你的问题。 : - )