【问题标题】:Importing records from a CSV and writing at the same time to same CSV?从 CSV 导入记录并同时写入同一个 CSV?
【发布时间】:2012-05-18 21:57:54
【问题描述】:

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

例如,一行如下所示:

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

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

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

总结一下:

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

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

【问题讨论】:

  • 在重新阅读问题时,“我需要将总记录分成小块”这一行对我来说很突出 - 为什么需要这样做?你能提供更多背景信息吗?

标签: ruby-on-rails ruby csv


【解决方案1】:

如果您可以找到Company,此代码 sn-p 将创建Review。您必须对其进行清理以使其与 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 列。

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

【讨论】:

  • 感谢您的快速回答,但 row[:imported] = true (或字符串)似乎不起作用。我在 rake 任务中使用它,但 a 中的“导入”字段不会改变。
  • 这就是我说我们需要更多信息的原因。你能发布那个模型代码吗?
  • 破坏的不是模型代码...即使这样也失败了: CSV.foreach('reviews.csv', :headers => true) do |row| row[:imported] = "true" end
  • @Laurens,您是否认为设置值row[:imported] = true 应该更改文件?这根本不是这样做的。他正在将导入的标志添加到您的新 Review 模型中。我不认为那是你想要做的。您需要以某种方式坚持每行的导入性,以供将来的导入运行。我的答案将在内存哈希中做到这一点。如果您在 CSV 文件本身中需要它,则需要在 CSV 中读取行,进行导入并设置标志,然后再次保存文件。乱七八糟!
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多