ruby net-sftp read file line by line
Asked Answered
D

3

5

I am using ruby 2.0.0 and rails 4.0.0. I have something similar to this:

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 

This opens the file on the FTP site, but it only puts the first line of the csv file. I need to read this file row by row, preferably ignoring the header.

How can I read the file row by row, without downloading the file locally?

Desolation answered 7/3, 2014 at 17:0 Comment(0)
D
5

I solved this by doing this:

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

data.each do |line|
  puts line
end
Desolation answered 7/3, 2014 at 19:20 Comment(2)
Your solution doesn't seem to meet your requirement "without downloading the file?"Orient
I edited my question to add "locally". This method just downloads the file into memory, so there is no physical copy of the file that I have to store.Desolation
I
3

The proper answer for this would actually be to use the file.eof? value.

The code would look like:

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

Documentation can be found here

Interwork answered 31/8, 2014 at 10:32 Comment(0)
C
0

In my case something like this worked:

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

Will also split each row of the .csv into different array columns and remove any excess of "". Note this is for mac where line breaks are \n.

Cornish answered 8/10, 2015 at 22:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.