5

私はすでに gettextfile メソッドを使用して ftp サーバーからレコードを取得しており、特定のブロック内の各レコードを処理して、最終的に別の場所に配置しています。

このファイルは CSV ファイルであり、CSV を使用してヘッダーとデータを取得し、いくつかの作業後に DB に配置する必要があります。多くの異なるファイルがあるため、一般的な方法が必要です。ファイルが非常に大きくなる可能性があるため、すべてのレコードをメモリまたはディスクにロードしたくありません。だからストリームはいいだろう

1 つのアイデアは CSV に io オブジェクトを与えることですが、Net::FTP でそれを行う方法がわかりません。

「http://stackoverflow.com/questions/5223763/how-to-ftp-in-ruby-without-first-saving-the-text-file」は既に表示されていますが、PUT で動作します。

何か助けはありますか?

4

3 に答える 3

3

Justin が言及している手法では、一時ファイルが作成されます。

retrlinesを使用できます:

   filedata = ''
   ftp.retrlines("RETR " + filename) do |block|
      filedata << block
   end

または代わりにretrbinary :

   filedata = ''
   ftp.retrbinary("RETR " + filename, Net::FTP::DEFAULT_BLOCKSIZE) do |block|
      filedata << block
   end
于 2013-10-24T14:37:46.467 に答える
1

gettextfile を使用したソリューションへのほとんどの道のりだと思います。ファイルの一部を に蓄積し、Arrayしきい値に達したときに CSV で処理することができます。一度に 10 行を処理する未テストのコードを次に示します。

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

これは私にとってはより単純な解決策の 1 つに思えますが、複数の UNIX プロセス (STDOUT への書き込みおよび STDOUT からの読み取り) または Ruby スレッドをプロデューサー/コンシューマー モデルで使用することもできます。

于 2012-12-01T20:05:44.287 に答える