我想将数据从CSV文件导入到现有的数据库表中。我不想保存CSV文件,只需要从其中获取数据并将其放入现有的表中。我使用的是Ruby 1.9.2和Rails 3。
这是我的表格:
create_table "mouldings", :force => true do |t|
t.string "suppliers_code"
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
t.integer "supplier_id"
t.decimal "length", :precision => 3, :scale => 2
t.decimal "cost", :precision => 4, :scale => 2
t.integer "width"
t.integer "depth"
end
你能给我一些代码来告诉我做这件事的最好方法吗,谢谢。
发布于 2010-12-11 00:15:51
require 'csv'
csv_text = File.read('...')
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
Moulding.create!(row.to_hash)
end
发布于 2012-05-03 05:03:12
yfeldblum答案的更简单版本,它更简单,也可以很好地处理大文件:
require 'csv'
CSV.foreach(filename, headers: true) do |row|
Moulding.create!(row.to_hash)
end
不需要with_indifferent_access
或symbolize_keys
,也不需要先将文件读入字符串。
它不会立即将整个文件保存在内存中,而是逐行读取并为每行创建一个Moulding。
发布于 2013-12-15 04:11:22
CSV gem是专门为这个用例创建的:从smarter_csv
文件中读取数据并快速创建数据库条目。
require 'smarter_csv'
options = {}
SmarterCSV.process('input_file.csv', options) do |chunk|
chunk.each do |data_hash|
Moulding.create!( data_hash )
end
end
您可以使用选项chunk_size
一次读取N个csv-row,然后在内部循环中使用Resque来生成将创建新记录的作业,而不是立即创建它们-这样您就可以将生成条目的负载分散到多个workers。
https://stackoverflow.com/questions/4410794
复制相似问题