首先,感谢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以进行处理和导出?这对我来说听起来并不自然。请指导我正确的道路。
答案 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
希望它有所帮助!