Qui n’a pas besoin de faire des imports csv dans sa base de donnée ???

La l’idée c’est de mettre en place un outil qui par une petite commande dans le terminal va nous importer toutes les lignes de notre fichier .csv.

#lib/tasks/import.rake
require "csv"

desc "Import CSV file to an active record table"

task :csv_model_import, [:filename, :model] => :environment do |task, args|
  firstline = 0
  keys = {}

  CSV.foreach(args[:filename]) do |row|
    if firstline == 0
      keys = row
      firstline = 1
      next
    end
    params = {}
    keys.each_with_index do |key, i|
      params[key] = row[i]
    end
    puts params
    c = Module.const_get(args[:model]).create(params)
  end
end

Mon fichier .csv doit se trouver à la racine de mon projet.

Pour lancer l’import il me suffit de taper la commande suivante :


bundle exec rake csv_model_import[fichier_a_importer.csv,MonModel]

Attention a ne pas mettre d’espace entre le nom du ficher et celui du model !!!!!

Vous adapterez en fonction de vos besoins, si vous utilisez paperclip et que le nom des images à importer est dans votre fichier .csv vous pouvez utilisez le code suivant :

Mes champs dans le fichier .csv sont « id, nom, code, image »

require "csv"

desc "Import CSV file to an active record table with images"

task :csv_model_import, [:filename, :model] => :environment do |task, args|
  firstline = 0
  keys = {}

  CSV.foreach(args[:filename]) do |row|
    if firstline == 0
      keys = row
      firstline = 1
      next
    end
    params = {}
    keys.each_with_index do |key, i|
      if key == "image"
        if !key.blank?
          params[key] = File.open('/Quel/que/soit/le/chemin/vers/le/fichier'+row[i].to_s)
        else
        end
      else
        params[key] = row[i]
      end
    end
    puts params
    c = Module.const_get(args[:model]).new do |each|
      each.id = params["id"]
      each.code = params["code"]
      each.nom = params["nom"]
      each.image = params["image"]
    end
    c.save
  end
end

Bon c’est vrai je n’ai pas fait abstraction du contexte dans ce dernier bout de code, mais si vous avez envie de le faire, n’hésitez pas je ferais la mise à jour.

Happy coding !