Ruby on rails ruby net sftp逐行读取文件

Ruby on rails ruby net sftp逐行读取文件,ruby-on-rails,ruby,sftp,net-sftp,Ruby On Rails,Ruby,Sftp,Net Sftp,我正在使用ruby 2.0.0和rails 4.0.0。我有类似的想法: require 'net/sftp' sftp = Net::SFTP.start('ftp.app.com','username', :password => 'password') sftp.file.open("/path/to/remote/file.csv", "r") do |f| puts f.gets end 这将在FTP站点上打开该文件,但它仅将放在csv文件的第一行。我需要

我正在使用ruby 2.0.0和rails 4.0.0。我有类似的想法:

require 'net/sftp'


 sftp = Net::SFTP.start('ftp.app.com','username', :password => 'password')

 sftp.file.open("/path/to/remote/file.csv", "r") do |f|
    puts f.gets
 end 
这将在FTP站点上打开该文件,但它仅将放在csv文件的第一行。我需要逐行读取此文件,最好忽略标题


如何在不从本地下载文件的情况下逐行读取文件?

我这样做解决了这个问题:

data = sftp.download!("/path/to/remote/file.csv").split(/\r\n/)

data.each do |line|
  puts line
end

正确的答案实际上是使用file.eof?价值观

代码如下所示:

require 'net/sftp'
sftp = Net::SFTP.start('ftp.app.com','username', :password => 'password')
sftp.file.open("/path/to/remote/file.csv", "r") do |f|
  while !f.eof?
    puts f.gets
  end
end

在我的案例中,可以找到文档,类似这样的工作:

data = sftp.download!("/path/to/remote/file.csv").split(/\n/).map{ |e| e.split(/,/).map{ |x| x.gsub(/"/, "")} }

data.each do |line|
  puts line
end

还将.csv的每一行拆分为不同的数组列,并删除多余的“”。请注意,这适用于断线的mac。\n.

您的解决方案似乎不符合您的要求“不下载文件?”我将问题编辑为添加“本地”。这种方法只是将文件下载到内存中,因此我不需要存储文件的物理副本。