使用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
好吧,有两件事我错了:
-
导出的csv文件不应该在字符串周围引用 – 我只是删除了它们。
-
感谢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
检查索引视图(如果已创建索引视图),您应该看到记录已成功导入到影片表中。