Ruby on Rails CSV导入rake任务失败并且不导入数据

时间:2016-02-12 03:54:48

标签: ruby-on-rails ruby csv

我尝试使用许多脚本和方法将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中,并且非常感谢一些帮助。请让我知道如何继续,非常感谢你们。

1 个答案:

答案 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