无法使用ruby CSV模块导入csv文件

时间:2010-09-10 03:50:09

标签: ruby-on-rails ruby csv import ruby-on-rails-3

我正在尝试使用Ruby的csv模块将csv文件中包含的记录导入Ruby on Rails 3应用程序中的本地表。

该表是通过创建模型Movie创建的。

这是我在控制台中执行的内容:

require 'csv'
CSV.foreach('public/uploads/VideoTitles2.csv') do |row|
    record = Movie.new(
        :media_format   => row[0], 
        :title          => row[1], 
        :copies_at_home => row[2], 
        :order          => row[3]
    )
    record.save
end

csv文件的行(在数据类型中)匹配它们传入的列。这是我试图导入的csv文件(VideoTitles2.csv)的缩短版本:

"DVD","LEAP OF FAITH",1,1
"DVD","COCOON",1,2
"DVD","TITANIC",1,3

每个记录用\ n分隔\ n我相信。此csv文件是从Access导出的,其原始文件扩展名为.txt。为了导入,我手动将其更改为.csv。

问题是,在rails控制台中执行上述行之后,我得到以下输出:

=> nil

导入似乎没有发生。如果有人知道如何解决这个问题,我真的很感激。

2 个答案:

答案 0 :(得分:2)

我没有看到问题。此代码段返回nil,因为CSV.foreach返回nil,但这并不表示循环是否运行。您是否检查过是否创建了Movie?你是否包括任何调试行来跟踪这个过程?

您可能需要检查record.save的输出(或调用record.save!),可能验证错误会阻止创建记录。另外,如果你想让循环返回创建的记录,你可以写这个(Ruby> = 1.8.7):

require 'csv'

records = CSV.foreach('public/uploads/VideoTitles2.csv').map do |media_format, title, copies_at_home, order|     
    Movie.create!({
        media_format: media_format, 
        title: title, 
        copies_at_home: copies_at_home, 
        order: order,
    })
end

答案 1 :(得分:1)

好吧有两件事我错了:

  1. 导出的csv文件不应该在字符串周围引用 - 我只是删除它们。

  2. 感谢tokland,record.save!是必要的(与我正在做的record.save相反) - 验证错误 阻止创建记录。

  3. 总而言之,人们可以在创建模型/表Movie后创建以下函数:

    class Movie < ActiveRecord::Base
      attr_accessible :media_format, :title, :copies_at_home, :order
      require 'csv'
    
      def self.import_movies()
        CSV.foreach('public/uploads/movies.csv') do |row|
            record = Movie.new(
                :media_format   => row[0], 
                :title          => row[1], 
                :copies_at_home => row[2], 
                :order          => row[3]
            )
            record.save!  
        end
      end
    end
    

    其中movies.csv如下所示:

    Blu-ray, Movie 1, 1, 1
    DVD, Movie 2, 1, 2
    Blu-ray, Movie 3, 1, 3
    

    然后在控制台中调用此函数:

    Movie.import_movies()
    

    并且,正如预期的那样,在控制台中返回的所有内容都将是:

    => nil
    

    检查索引视图(如果已创建索引视图),您应该看到记录已成功导入到影片表中。