Rails 4 - 导入CSV无效

时间:2016-04-22 06:54:23

标签: ruby-on-rails arrays csv hash

在rails 4.2.4中,我试图从.csv文件中提取数据并将其保存到数据库中。但是现在从文件中提取的row格式错误,因此值没有得到保存。

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\tsannidhi@gmail.com\tsannidhi123@\t"]类似。从row开始,我没有单独为每个值Eg: row[0], row[1] & row[2]分配相关的数据库字段。

如何解决此CSV导入问题?请帮帮我。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

您的CSV文件使用tab作为列分隔符。您可以将自己的列分隔符作为CSV选项传递给col_sep。即使其他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

答案 2 :(得分:-1)

CSV代表逗号分隔值。您的文件似乎用空格分隔。用逗号替换文件中的选项卡。