使用ruby CSV模块导入csv文件时出现问题

我正在尝试使用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分隔的地方我相信。 此csv文件是从Access导出的,其原始文件扩展名为.txt。 为了导入,我手动将其更改为.csv。

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

 => nil 

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

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

您可能想要检查record.save的输出(或调用record.save! ),也许validation错误会阻止创建记录。 另外,如果你想让循环返回创建的记录,你可以写这个(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. 导出的csv文件不应该在字符串周围引用 – 我只是删除了它们。

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

总而言之,在创建模型/表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 

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