Я ищу способ прочитать и разобрать локально удаленный 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?
Update
Лучшее решение, которое я нашел до сих пор, следующее:
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]
Это код из моего файла test.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.
Любые предложения?