2016-02-12 39 views
0

我試圖導入CSV文件導入紅寶石使用許多腳本和方法,似乎沒有任何工作軌道不導入數據。我一直希望從埃裏克on Rails的博客的代碼將有助於讓我的工作做好。Ruby on Rails的CSV導入rake任務自動失敗和

我把這個腳本放到LIB /任務/ 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 generate model SomeModel 

然後在鐵軌控制檯運行這個模型

rake csv_model_import[somefile.csv,SomeModel] 

運行之後,光標剛剛返回控制檯。它默默地失敗。查看導軌程序的數據庫文件時,在導入 之後該表爲空。它已經提交導入數據。

我嘗試別的東西爲好。我試着在運行rake import命令之前首先創建一個具有定義的字段和類型的模型。這也以同樣的方式失敗了。

我是Ruby on Rails的新手,我是。我花了2天的時間嘗試將CS​​V文件導入到Ruby on Rails中,並且非常感謝您的幫助。請讓我知道如何繼續,非常感謝這麼多人。

回答

1

按照您的方法,爲什麼你可能不會得到任何東西:

當我試圖複製錯誤,下面是我發現了什麼:

lines = File.new(args[:filename]).readlines讀取文件作爲一個元素由細胞逗號(,)和新線新線(\r or \n) ...如分離:["name,age,food\rtabitha,2,carrots\relijah,1,lettuce\rbeatrice,3,apples"]

這是主要的問題,因爲博客文章可能有anoth呃格式,其餘的代碼都是基於此格式的。

有了這個輸出,但是......執行如上所述的移位和分割和剝離不會產生任何結果。

我那時是基於下面的步驟,結果工作過:

1)獲取內容:

file = File.new(args[:filename]).readlines => ["name,age,food\rtabitha,2,carrots\relijah,1,lettuce\rbeatrice,3,apples"] 

2)解析爲所需的格式由分裂的新-lines(\我的情況R)

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 
+0

WOW,感謝這麼多它的工作的幫助。對於任何試圖使用此方法的人: – akaras222

+1

注意:首先在命令提示符下生成模型:rails g model somemodel name:string age:string food:string(注意somemodel中的小寫字母s)然後複製代碼塊「full gist」進入lib/task並保存爲import.rake,然後返回到命令提示符中輸入:rake csv_model_import [directory/file.csv,Somemodel](請注意這次Somemodel中的大寫S) – akaras222

+0

謝謝。請將答案標記爲已接受,以便對其他人有用 –