0

CSVのすべての行の2つの列を自分のデータベースと比較できるようにする必要があります。

たとえば、行は次のようになります。

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]ビットは、行を2回読み取ることを防ぎます。

それがあなたが探しているものではない場合、あなたはあなたの質問を少し明確にする必要があるでしょう。:-)

于 2012-05-19T01:32:25.400 に答える