2014-03-07 80 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。