2016-04-22 119 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

它现在正在工作。谢谢。 –