每次在rails中导入带有不同列标题的CSV

时间:2015-11-27 14:24:38

标签: ruby-on-rails ruby csv

首先,感谢StackOverFlow社区帮助我学习ruby on rails。作为学习的一部分,我正在一个项目中工作,该项目基本上接受不同的csv / excel文件到app,处理它并导出。

例如,如果csv列标题类似于name, email, phone

下一个csv列标题将与name, address, email, country

联系

导入csv的代码:

rows = CSV.read("path/to/file.csv")

      rows.each do |row|
       //Processing each rows.

      end

我的疑问,

由于每个文件都有不同的列标题,我如何导入数据库?

是否可以在运行时导入csv文件而不保存db以进行处理和导出?这对我来说听起来并不自然。请指导我正确的道路。

2 个答案:

答案 0 :(得分:2)

创建一个用于将csv数据导入的表。我们称之为CsvDatum。修复所有csv共享的列,并创建第三个text列以存储包含额外属性的哈希。让我们说所有csv都有姓名和电子邮件。架构应如下所示。

  create_table "csv_data", force: :cascade do |t|
    t.string   "name",         limit: 255
    t.string   "email",        limit: 255
    t.text     "extra_columns",  limit: 65535
  end

在你的模特中

class CsvDatum < ActiveRecord::Base
  serialize :extra_columns, Hash
end

现在,当您阅读csv文件时,请创建CsvDatum类的实例以保存行数据。

CSV.foreach("path/to/file.csv", headers: true) do |row|
  data = CsvDatum.new(name: row["name"], email: row["email"])
  row.delete["name"]
  row.delete["email"]
  data.extra_columns = row.to_hash
  data.save
end

答案 1 :(得分:0)

您可以执行类似

的操作
def your_method
    allowed_attributes = [ "arr1", "arr2"] # list all possible attributes here
    data = CSV.read("path/to/file.csv")
    header = data.row(1)
    results = []
    (2..data.last_row).map do |i|
      row = Hash[[header, data.row(i)].transpose]
        data_row = Your_model.new
        data_row.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k } #it maps the header with data
        results << data_row
      end
    end
    return results # final data
  end

希望它有所帮助!