我尝试使用许多脚本和方法将CSV文件导入ruby on rails并且似乎没有任何效果。我一直希望Erik on Rails博客的代码能帮助我完成工作。
我将此脚本放入lib / tasks / import.rake:
desc "Imports a CSV file into an ActiveRecord table"
task :csv_model_import, [:filename, :model, :needs] => [:environment] do |task,args|
lines = File.new(args[:filename]).readlines
header = lines.shift.strip
keys = header.split(',')
lines.each do |line|
values = line.strip.split(',')
attributes = Hash[keys.zip values]
Module.const_get(args[:model]).create(attributes)
end
end
我在rails控制台中创建了一个模型
rails generate model SomeModel
然后在rails控制台中运行它
rake csv_model_import[somefile.csv,SomeModel]
运行此命令后,光标将在控制台中返回。它无声地失败了。查看rails程序的数据库文件时,该表为空 进口。它已提交导入数据。
我还尝试了别的东西。我尝试在运行rake import命令之前首先创建一个定义了字段和类型的模型。这也以同样的方式失败了。
我是Ruby on Rails的新手,我是。我花了两天的时间尝试将一个CSV文件放到Ruby on Rails中,并且非常感谢一些帮助。请让我知道如何继续,非常感谢你们。
答案 0 :(得分:1)
继续你的方法,为什么你可能没有得到任何东西:
当我尝试复制错误时,我发现了以下内容:
行
lines = File.new(args[:filename]).readlines
将文件作为一个元素读取,以逗号(,)表示单元格,新行(\r or \n)表示新行...例如:["name,age,food\rtabitha,2,carrots\relijah,1,lettuce\rbeatrice,3,apples"]
这是一个主要问题,因为博客文章可能有其他格式,其余代码基于此。
然而,使用此输出......如上所述执行移位和分割以及剥离不会产生任何结果。
我接下来要做的是根据结果通过以下步骤进行解决:
1)获取内容:
file = File.new(args[:filename]).readlines => ["name,age,food\rtabitha,2,carrots\relijah,1,lettuce\rbeatrice,3,apples"]
2)通过拆分新行(在我的情况下为\ r \ n)解析成所需的格式
lines = file.shift.strip.gsub(/\r/,"\\").split(/\\/) => ["name,age,food", "tabitha,2,carrots", "elijah,1,lettuce", "beatrice,3,apples"]
3)获取标题:
header = lines.first => "name,age,food"
4)获取身体:
body = lines[1..-1] => ["tabitha,2,carrots", "elijah,1,lettuce", "beatrice,3,apples"]
5)从标题中获取密钥:
keys = header.split(',') => ["name", "age", "food"]
6)遍历正文并在数据库中创建对象:
body.each do |line|
values = line.strip.split(',')
attributes = Hash[keys.zip values]
Module.const_get(args[:model]).create(attributes)
end
完整的要点如下:
desc "Imports a CSV file into an ActiveRecord table"
task :csv_model_import, [:filename, :model, :needs] => [:environment] do |task,args|
file = File.new(args[:filename]).readlines
lines = file.shift.strip.gsub(/\r/,"\\").split(/\\/)
header = lines.first
body = lines[1..-1]
keys = header.split(',')
body.each do |line|
values = line.strip.split(',')
attributes = Hash[keys.zip values]
Module.const_get(args[:model]).create(attributes)
end
end
PS:我注意到对ProgNoob答案的评论。您必须首先创建具有所有所需属性的模型并迁移数据库。然后,您可以将模型名称和csv文件名传递到rake文件中。
就我而言,我生成的模型Somemodel
如下:
rails g model somemodel name:string age:string food:string
请注意,我添加了所有需要的属性。
然后将我的数据库迁移为:
$ rake db:migrate