2016-01-28 1 views
0

Actuellement, j'ai un fichier csv qui remplit une table. Je suis wanitng ot programmer ceci ainsi il fonctionne tous les jours. Cependant, plutôt que d'effacer la table, pourrait-il être possible de l'avoir afin qu'il ajoute seulement ce qui n'existe pas encore?Mise à jour de la table de base de données csv

Disons que j'ai cette disposition pour le moment.

Title|Name|Date|Url| 
1 |2 |3 |4 | 

Alors mon CSV a cette intérieur

Title|Name|Date|Url| 
1 |2 |3 |4 | 
1 |2 |3 |7 | 

Serait-il possible d'ignorer la première ligne du csv et ajouter le second comme le champ de la colonne URL est différente?

Heres ce que j'ai jusqu'à présent

require 'open-uri' 
require 'csv' 
namespace :event do 
    task reload: :environment do 
    ActiveRecord::Base.connection.execute("TRUNCATE events RESTART IDENTITY") 
     gzipped = open('URL LINK HERE') 
     csv_text = Zlib::GzipReader.new(gzipped).read 
     csv = CSV.parse(csv_text, :headers=>true) 
     csv.each do |row| 
     Event.create(time: row[9], date: row[10], URL: row[8], eventname: row[7]) 

     end 
    end 
end 

Je sais que je vais évidemment regarderais enlever ce mensonge et chanign à une mise à jour de quelque sorte?

ActiveRecord::Base.connection.execute("TRUNCATE events RESTART IDENTITY") 

Aussi, j'utilise des rails si cela aide du tout?

+0

vous auriez à garder une trace de l'endroit où vous l'avez laissé dans le fichier csv. par exemple. enregistrer l'octet offset/l'emplacement du pointeur de fichier, puis 'seek()' à chaque fois. –

+0

Le CSV est constamment en mouvement, il devrait être scanné à chaque fois, la seule chose qui reste le même sont les en-têtes et les URL sont les choses uniques. – SamAdmit

+0

alors probablement la chose la plus facile est de charger tout le csv dans une table temporaire, puis de fusionner cette table temporaire avec la table "real", ainsi seuls les nouveaux enregistrements seront ajoutés. –

Répondre

0

Vous pouvez utiliser find_or_create_by, comme ceci:

Event.find_or_create_by(time: row[9], date: row[10], URL: row[8], eventname: row[7]) 

Cela ne créera une nouvelle ligne à moins qu'il ne trouve une correspondance sur les 4 champs.

Source: http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by

+0

Hey, j'ai juste besoin de supprimer cette ligne droite ?, 'ActiveRecord :: Base.connection.execute (" Événements TRUNCATE RESTART IDENTITY ")' – SamAdmit

+0

@SamAdmit oh oui, vous wouldn Je n'ai plus besoin de cette ligne. – miligraf

+0

Brillant! A travaillé un régal – SamAdmit