2016-04-22 180 views
1

在導軌4.2.4中,我試圖從.csv文件中提取數據並將其保存到數據庫中。但是現在從文件中提取row的格式不正確,因此值無法保存。導軌4 - 導入CSV不起作用

require 'csv' 
filename = "#{asset.document.path}" 
if File.exist?(filename) 
    file = File.open(filename) 
    if file 
    CSV::parse(file)[1..-1].each do |row| 
     User.create_data(row, admin) 
    end 
    end 
end 

def create_data(row, admin) 
    usr = User.new 
    usr.name = row[0] if row[0] 
    usr.email = row[1] if row[1] 
    usr.password = row[2] if row[2] 
    user.save 
end 

生成row的數據是像["Sannidhi\[email protected]\[email protected]\t"]。從這個row我沒有得到每個值分別Eg: row[0], row[1] & row[2]分配給相關的數據庫字段。

如何解決此CSV導入問題?請幫幫我。

回答

1

試試這個:

CSV::parse(file)[1..-1].each do |row| 
    row.shift.split("\t") unless row.blank? 
    User.create_data(row, admin) 
end 

在這之後,你應該能夠訪問:

row[0] #=> "Sannidhi" 
row[1] 
row[2] 
+0

我收到了零這個'未定義的方法「分裂」:NilClass'錯誤 –

+0

@ShruthiR你可以發佈你試過嗎?我猜你正在做一個空白的行。 – dp7

+0

正如我上面提到的行有'[「Sannidhi \ [email protected] \ tsannidhi123 @ \ t」]' –

-1

CSV代表逗號分隔值。看來你的文件是用空格分隔的。用逗號替換文件中的選項卡。

1

您CSV文件使用tab S作爲列分隔符。您可以將自己的列分隔符作爲col_sep選項傳遞給CSV。即使其他2個答案將做的工作,讓csv完成其工作對自己:

CSV::parse(file, col_sep: "\t")[1..-1].each do |row| 
    User.create_data(row, admin) 
end 

而且,考慮使用headers選項來使用該文件的第一行作爲標題,而不是[1..-1]

CSV::parse(file, col_sep: "\t", headers: 'first_row').each do |row| 
    User.create_data(row, admin) 
end 
+0

如何使用CSV :: parse(file,col_sep:「\ t」,headers:'first_row')'忽略標題? –

+0

如果你添加'header:true',你的csv文件的第一行將被自動忽略。 – Uzbekjon

+0

它現在正在工作。謝謝。 –