我正在使用Sequel,Sinatra,Postgres和ruby。我有一个上传csv文件的表单,该文件可以正常工作,然后问题是将csv文件中的字段解析并将其插入到postgres数据库中。csv文件的结构如下:
first,last,designation,email,phone,company,remarks,owner,date
John,McAndrew,CEO,[email protected],44 113 388 4300,Callcredit Information Group,none,[email protected],now()
postgres数据库具有相同的字段。
我想保留标题,然后遍历记录(可能有100s)并插入数据库。我首先仅尝试一个字段,然后需要插入所有字段。到目前为止,我的红宝石代码是:
require 'csv'
post '/upload' do
file_data = params[:myfile][:tempfile].read
#file_data = params[:file].read
csv_rows = CSV.parse(file_data, headers: true)
owner = '[email protected]'
csv_rows.map do |row|
{firstname => row[:first]}
DB[:prospects].insert( :first => firstname, :owner => owner )
end
end
这不起作用,我得到以下信息:PG :: UndefinedColumn:错误:列“名字”不存在。
然后我尝试了:
require 'csv'
post '/upload' do
file_data = params[:myfile][:tempfile].read
#file_data = params[:file].read
csv_rows = CSV.parse(file_data, headers: true)
owner = '[email protected]'
csv_rows.each do |row|
DB[:prospects].insert( :first => row[:first], :owner => owner )
end
end
它不返回错误,但仅插入变量所有者,它完全忽略row [:first]或找不到它。
正确的方法是什么?谢谢!
这有效(在SoulRebel的帮助下):
post '/upload' do
file_data = params[:myfile][:tempfile].read
#file_data = params[:file].read
csv_rows = CSV.parse(file_data, headers: true)
owner = '[email protected]'
csv_rows.each do |row|
DB[:prospects].insert( :first => row[:first], :owner => owner )
end
end
经过反复试验,我发现这也是可行的:
post '/uploading' do
file_data = params[:myfile][:tempfile].read
csv_rows = CSV.parse(file_data, headers: true, header_converters: :symbol)
owner = '[email protected]'
remarks = 'none yet'
csv_rows.each do |row|
DB[:prospects].insert( :first => row[:first], :last => row[:last], :designation => row[:designation], :email => row[:email], :phone => row[:phone], :company => row[:company], :industry => row[:industry], :city => row[:city], :country => row[:country], :status => row[:status], :remarks => remarks, :owner => owner )
end
return "File successfully uploaded"
end
注意“ header_converters :: symbol”的添加
一如既往,感谢SO社区。
尝试这个:
CSV.foreach($csv_fname, :headers => true) do |csv_obj|
puts csv_obj['first'] #just to verify that parsing is working well
DB[:prospects].insert( :first => cvs_obj['first'], :owner => csv_obj['owner'] )
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句