Cod*_*Guy 4 ruby csv ruby-on-rails
我有一个上传的CSV文件,我解析如下:
CSV.foreach(@my_file.file.path) do |row|
puts row[1]
end
Run Code Online (Sandbox Code Playgroud)
传入的CSV文件至少包含以下列:"id","name","number","phone"和"food".
我想做的事情如下:
CSV.foreach(@my_file.file.path) do |row|
//find the columns in "row" associated with "id", "name", "number"
//even though I don't know definitively which column they will be in
//for example, "name" may be the 2nd or 3rd or 4th column (etc)
//insert into my_table values(id, name, number)
end
Run Code Online (Sandbox Code Playgroud)
请注意,CSV文件将始终具有列名作为第一行,但是从文件到文件,这些列的顺序可能不同.
这是一段代码,它只会将你关心的字段收集到一个哈希数组中:
require 'csv'
fields_to_insert = %w{ id name food number phone }
rows_to_insert = []
CSV.foreach("stuff.csv", headers: true) do |row|
row_to_insert = row.to_hash.select { |k, v| fields_to_insert.include?(k) }
rows_to_insert << row_to_insert
end
Run Code Online (Sandbox Code Playgroud)
鉴于以下内容stuff.csv:
junk1,name,junk2,food,id,junk4,number,phone
foo,Jim,bar,pizza,123,baz,9,555-1212
baz,Fred,bar,sushi,55,foo,44,555-1213
Run Code Online (Sandbox Code Playgroud)
rows_to_insert 将包含:
[{"name"=>"Jim",
"food"=>"pizza",
"id"=>"123",
"number"=>"9",
"phone"=>"555-1212"},
{"name"=>"Fred",
"food"=>"sushi",
"id"=>"55",
"number"=>"44",
"phone"=>"555-1213"}]
Run Code Online (Sandbox Code Playgroud)
我会接受并使用activerecord-import将它们全部插入:
SomeModel.import(rows_to_insert)
Run Code Online (Sandbox Code Playgroud)
您可以在CSV循环中一次插入一条记录,但这样效率很低,而且由于id通常是受保护的属性,因此您无法对其进行大量分配,因此您必须执行此操作才能插入单个记录:
some_model = SomeModel.new(row_to_insert.select { |k, v| k != "id" }
some_model.id = row_to_insert["id"]
some_model.save!
Run Code Online (Sandbox Code Playgroud)
......或类似的东西.
| 归档时间: |
|
| 查看次数: |
5371 次 |
| 最近记录: |