我已经使用gettextfile方法从ftp服务器获取记录,并处理给定块中的每条记录,最后将其放在其他位置.
这个文件是一个CSV文件,我需要使用CSV来获取标题和数据,并在完成一些工作后将其放在数据库中.由于我有许多不同的文件,我需要一种通用的方式.我不想在内存或磁盘上加载所有记录,因为文件可能非常大!所以一个流将是好的
一个想法是给CSV提供一个io对象,但我不知道如何用Net :: FTP做到这一点.
我已经看到"http://stackoverflow.com/questions/5223763/how-to-ftp-in-ruby-without-first-saving-the-text-file",但它可以与PUT一起使用.
有帮助吗?
我认为您已经通过 gettextfile 解决了大部分问题。您可以将文件的一部分累积到 中Array,然后在达到某个阈值时使用 CSV 对其进行处理。这是一些未经测试的代码,一次处理十行:
current_line = 0
chunk = []
ftp.gettextfile('file.csv') do |line|
chunk << line
process_chunk!(chunk) if current_line % 10 == 0
current_line += 1
end
process_chunk!(chunk) # Any remaining lines in final partial chunk
def process_chunk!(lines_in_chunk)
# process partial chunk of lines as if it were the whole file
lines_in_chunk = []
end
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是更简单的解决方案之一,但您也可以在生产者-消费者模型中使用多个 unix 进程(写入和读取 STDOUT)或 Ruby 线程。