Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby和Sinatra,如何上传csv文件并将每一行插入postgres数据库?_Ruby_Postgresql_Csv_Sinatra - Fatal编程技术网

使用Ruby和Sinatra,如何上传csv文件并将每一行插入postgres数据库?

使用Ruby和Sinatra,如何上传csv文件并将每一行插入postgres数据库?,ruby,postgresql,csv,sinatra,Ruby,Postgresql,Csv,Sinatra,我正在使用Sequel、Sinatra、Postgres和ruby。我有一个上传csv文件的表单,它运行良好,问题是解析csv文件中的字段并将其插入postgres数据库。csv文件的结构如下所示: first,last,designation,email,phone,company,remarks,owner,date John,McAndrew,CEO,debra.wagman@callcreditgroup.com,44 113 388 4300,Callcredit Informatio

我正在使用Sequel、Sinatra、Postgres和ruby。我有一个上传csv文件的表单,它运行良好,问题是解析csv文件中的字段并将其插入postgres数据库。csv文件的结构如下所示:

first,last,designation,email,phone,company,remarks,owner,date
John,McAndrew,CEO,debra.wagman@callcreditgroup.com,44 113 388 4300,Callcredit Information Group,none,tim@xxxx.jp,now()
postgres数据库具有相同的字段

我想保留标题,然后循环遍历记录(可能有100条)并插入到数据库中。我只是先用一个字段进行实验,然后需要插入所有字段。到目前为止,我掌握的ruby代码是:

 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 = 'tim@xxxx.jp'
      csv_rows.map do |row| 
       {firstname => row[:first]}
          DB[:prospects].insert( :first =>  firstname, :owner => owner )
      end
     end
这不起作用,我得到这样一个结果:PG::UndefinedColumn:ERROR:列“firstname”不存在

然后我试着:

 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 = 'tim@xxxx.jp'
      csv_rows.each do |row| 

       DB[:prospects].insert( :first =>  row[:first], :owner => owner )

          end
      end
它不返回错误,但只插入变量所有者,它完全忽略行[:first]或找不到它

什么是正确的方法?谢谢

这是有效的(在SoulRebel的帮助下):

经过反复试验,我发现这也是可行的:

post '/uploading' do
  file_data = params[:myfile][:tempfile].read
  csv_rows  = CSV.parse(file_data, headers: true, header_converters: :symbol)
  owner = 'tim@xxxx.jp'
  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
注意添加了“标题\转换器::符号”

一如既往,感谢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

看起来很酷,谢谢。我会尝试一下,然后给你一个漂亮的绿色勾号反馈,如果它有效的话。我很感谢你的帮助和建议。谢谢你稍加修改,效果很好。我已经修改了上面的代码,以反映您的建议并呈现正确工作的代码片段。另外,值得注意的是,包含header_converters::symbol解决了所有问题。
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