2014-03-07 61 views
3

我正在使用ruby 2.0.0和rails 4.0.0。我有一些与此类似:ruby​​ net-sftp按行读取文件

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站点的文件,但只有puts它CSV文件的第一行。我需要逐行阅读这个文件,最好忽略头文件。

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

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

data.each do |line| 
    puts line 
end 

回答

2

我做这个解决了这个?值。

的代码是这样:

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 

文档可以发现here

+0

您的解决方案似乎不符合您的要求“无需下载文件?” – meagar

+0

我编辑我的问题添加“本地”。这种方法只是将文件下载到内存中,所以没有必须存储的文件的物理副本。 – Luigi

0

正确答案这实际上是使用了file.eof:

0

在我的情况是这样的工作:

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的每一行到不同的数组列并删除任何多余的“”。请注意,这适用于换行符为\ n的mac。