2014-09-13 87 views
1

我对使用CSV将数据导入到SQL数据库的概念很陌生。我跟着一些stackoverflow帖子,但我得到一个错误。错误状态,Errno::ENOENT: No such file or directory @ rb_sysopen - products.csv运行后rake import:data。我在我的application.rb中需要csv,并且我创建了一个csv文件并将其放在TMP中。这是我的代码到目前为止。
我知道我可能会向社区要求很多,但如果有人回答这个问题,您是否可以提供一些关于CSV和Rake功能的更多信息。非常感谢!!!错误:导入数据CSV导轨4

<b>import.rake</b> 
    namespace :import do 
     desc "imports data from a csv file" 
     task :data => :environment do 
      require 'csv' 
      CSV.foreach('tmp/products.csv') do |row| 
       name = row[0] 
       price = row[1].to_i 
       Product.create(name: name, price: price) 
      end 

     end 
    end 

回答

0

指定CSV文件的完整路径。

例如,如果该文件是在/tmp/使用:

CSV.foreach('/tmp/products.csv') do |row| 

如果products.csv文件是在应用程序的tmp目录,使用:

CSV.foreach(Rails.root.join('tmp', 'products.csv')) do |row| 
+0

当我加入CSV.foreach(Rails.root.join( 'TMP', 'products.csv'))做|行|错误消失,但我收到另一个错误NameError:未初始化的常量Product?我能做些什么来解决这个问题? – eNN 2014-09-13 04:03:53

+0

您的产品型号未找到。您已经加载Rails环境,那么您是否定义了产品模型? – infused 2014-09-13 04:05:20

+0

我有一个product.rb但我没有定义任何方法。我错过了什么。对不起,如果我询问基本问题 – eNN 2014-09-13 04:09:19

0

我碰到了类似的东西,它被遗忘把两个括号括在括号中,所以你可能想尝试从:

Product.create(name: name, price: price) 

到:

Product.create({ name: name, price: price }) 
0

退房的smarter_csv宝石。

在它最简单的形式,你可以这样做:

 SmarterCSV.process('tmp/products.csv').each do |hash| 
     Product.create(hash) 
     end 

smarter_csv添加到您的Gemfile,所以当你在你的Rake任务所需要的环境,这是自动加载

这给了你:

 namespace :import do 
     desc 'imports data from given csv file' 
     task :data, [:filename] => :environment do |t, args| 
     fail "File not found" unless File.exists? args[:filename] 

     options = {} # add options if needed 
     SmarterCSV.process(args[:filename], options).each do |hash| 
      Product.create(hash) 
     end 
     end 
    end 

这样称呼它:

 rake import:data['/tmp/products.csv'] 

参见:https://github.com/tilo/smarter_csv