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?
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. –
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
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. –