Ruby 1.9.2 - Чтение и анализ удаленного CSV

Я ищу способ читать и анализировать локально удаленный CSV (размещенный на определенном веб-сайте).

Я нашел в Интернете пару интересных примеров, в которых используется FasterCSV, который в ruby ​​1.9.2 был объединен с CSV. Я обнаружил, что вы можете прочитать удаленный CSV, используя драгоценные камни csv и open-uri следующим образом:

require 'csv'
require 'open-uri'

def read(url)
  open(url) do |f|
    f.each_line do |l|
      CSV.parse(l) do |row|
        puts row
      end
    end
  end
end

Но когда я вызываю эту функцию, я получаю исключение:

ERROR IOError: closed stream

Кто-нибудь может мне объяснить, почему? Что-то не так? Следует ли мне выбрать другой подход для чтения удаленных CSV?

Обновление

Лучшее решение, которое я нашел до сих пор:

def read(url)
  data = []
  begin
    open(url) do |f|
      data = CSV.parse f
    end
  rescue IOError => e
    # Silently catch the exception ...
  end

  return data
end

, но оно кажется не таким чистым. Мне действительно не нравится тихонько перехватывать исключение там, где его не должно быть ...

Обновление 2

Я могу воспроизвести ошибку, используя как

ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]

, так и

ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]

Это код из моего теста .rb файл:

require 'rubygems'
require 'open-uri'
require 'csv'

def read(url)
  data = []
  begin
    open(url) do |f|
      data = CSV.parse f
    end
  end

  puts data
end

read("http://www.euribor-ebf.eu/assets/modules/rateisblue/processed_files/myav_EURIBOR_2011.csv")

А это результат выполнения команды ruby ​​test.rb

/Users/marzu/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/open-uri.rb:152:in `close': closed stream (IOError)
from /Users/marzu/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/open-uri.rb:152:in `open_uri'
from /Users/marzu/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/open-uri.rb:671:in `open'
from /Users/marzu/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/open-uri.rb:33:in `open'
from test.rb:8:in `read'
from test.rb:16:in `<main>'

Я использую rvm 1.6.9 в Mac OS X 10.6. 7.

Есть предложения?

18
задан marzapower 15 May 2011 в 11:50
поделиться