simple_importer
Simple API for importing csv files.
Defining importers
The basic importer has a name, file, and a foreach block.
importer :items do
file 'items.csv'
foreach do |row|
Item.create(:name => row[:name])
end
end
simple_importer uses fastercsv, which replaces the csv standard lib in ruby1.9. Importers have configuration options that match those of fastercsv. The foreach block is called for each row in the csv file. The argument passed into the foreach block is a fastercsv row created with the specified configuration.
importer :items do
file 'items.csv'
# all fastercsv options are supported
headers false
converters :numeric
# etc..
foreach do |row|
Item.create(:name => row[:name])
end
end
Importers have a default configuration that matches the following importer.
importer :items do
file 'items.csv'
# default configuration
col_sep ","
row_sep :auto
quote_char '"'
field_size_limit nil
converters :all
unconverted_fields nil
headers true
return_headers false
header_converters :symbol
skip_blanks false
force_quotes false
# end default configuration
foreach do |row|
Item.create(:name => row[:name])
end
end
Before callback
Define before_filter-style callbacks in the form of the before block. This block is run once before the importer runs.
importer :items do
file 'items.csv'
before do
Item.delete_all
end
foreach do |row|
Item.create(:name => row[:name])
end
end
File processing
Passing an array of file paths to the file configuration field will process all the rows in each file.
importer :items do
file Dir.glob("data/*.csv")
foreach do |row|
Item.create(:name => row[:name])
end
end
Use the foreach_file block to add per-file behavior.
importer :items do
file Dir.glob("data/*.csv")
foreach_file do |file|
List.create(:name => File.basename(file, ".csv"))
end
foreach do |row|
Item.create(:name => row[:name])
end
end
Nest the foreach block to give your row processing block access to foreach_file block variables.
importer :items do
file Dir.glob("data/*.csv")
foreach_file do |file|
list = List.create(:name => File.basename(file, ".csv"))
foreach do |row|
Item.create(:name => row[:name], :list => list)
end
end
end
Loading and running importers
simple_importer provides a method that will find and load importer definitions in the importers, lib/importers, and app/importers directories.
# importer definition is in lib/importers/item.rb
SimpleImporter.find_importers
SimpleImporter now has a collection of importers and each importer can be run now that it has been loaded.
# the following will fire off the actual importers
SimpleImporter.importers.each do |importer|
importer.run
end
Rake tasks and autoloaded importers
simple_importer provides rake tasks to run importers individually or all at once.
# add this to your rakefile
# lib/tasks/simple_importer.rake is a good place in your rails app
require 'simple_importer/tasks'
rake -T simple_importer will show a rake task for each importer as well as an import task which runs all of the importers. Descriptions defined in the importer will be used for the rake task description.
importer :items do
file 'items.csv'
desc 'Import all of the cool items'
...
end
Requirements
-
fastercsv (if you are not using ruby 1.9)
Note on Patches/Pull Requests
-
Fork the project.
-
Make your feature addition or bug fix.
-
Add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
-
Send me a pull request. Bonus points for topic branches.
Copyright
Copyright © 2009 Justin Marney. See LICENSE for details.