Importing products from Magento into Spree

Magento is evil. If you're working with its PHP codebase, I'm sorry. After looking for an easier, less dangerous solution, I found Spree. Easy to use, looks half decent out of the box, and built on Ruby on Rails, the slow but easy web framework. And there's a Heroku extension. Awesome.

One problem: The Magento installation had 9000 products, with names, descriptions, SKUs, and other fun attributes. Spree has no built-in import or export function. Do I want to enter all this information manually? No.

After some googling, yahooing, and asking jeeves, I found a Google group discussion, took some of the example code, tailored it to the CSV format of a standard Magento export, and ended up with this hack:
require 'fastercsv'
n = 0
FasterCSV.foreach("export_all_products.csv") do |row|
if n != 0
puts "Adding new product: #{row[7]}"
product = Product.new
product.name = row[7]
product.description = row[27]
product.sku = row[5].to_s
product.price = row[22].to_d
product.save!
end
n += 1
end
puts ""
puts "Import Completed - Added: #{n} Products"
view raw import.rb hosted with ❤ by GitHub
If you don't have the FasterCSV gem installed, install it before running this import script:
gem install fastercsv

Use the Rails runner to run this script so it has access to the database:
script/runner import.rb

and you're done.

3 comments:

  1. Chris Cummings8/02/2011 12:55 AM

    Thanks for posting this. I'm hoping to convince my boss in a few months to let me switch our massive store (29k SKUs) from Magento to Spree. This was a hurdle I wasn't looking forward to dealing with.

    ReplyDelete
  2. Aaron Lifton12/23/2011 9:15 AM

    No problem, glad I was able to help someone out!

    ReplyDelete
  3. Good to know, FasterCSV looks useful. I'm trying to do the same thing but decided to go with datashift_spree. It supports importing images and it allows you set default values if some of the columns are missing. All from the command line.

    https://github.com/autotelik/datashift_spree

    ReplyDelete