Ruby 1.9.2 - 读取并解析远程 CSV

发布于 2024-11-07 22:45:19 字数 1888 浏览 0 评论 0原文

我正在寻找一种在本地读取和解析远程 CSV(托管在特定网站上)的方法。

我在互联网上发现了一些使用 FasterCSV 的有趣示例,在 ruby​​ 1.9.2 中已合并到 CSV 中。我发现你可以这样使用 gems 'csv' 和 'open-uri' 读取远程 CSV:

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]

这是我的 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>'

我在 Mac OS X 10.6.7 上使用 rvm 1.6.9

有什么建议吗?

I am looking for a way to read and parse locally a remote CSV (hosted on a particular website).

I found on the Internet a couple of interesting examples that make use of FasterCSV, that in ruby 1.9.2 has been merged into CSV. I found that you can read a remote CSV using the gems 'csv' and 'open-uri' this way:

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

But when I call this function, I get an exception:

ERROR IOError: closed stream

Anyone can explain me why? Is there anything wrong? Should I choose another approach for reading remote CSV's?

Update

The best solution I've found till now is this:

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

but it somewhat seems not so clean. I really do not like silently catching an exception where it shouldn't be ...

Update 2

I can reproduce the error using both

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

and

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

This is the code from my test.rb file:

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")

And this is the output of the ruby test.rb command

/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>'

I am using rvm 1.6.9 on Mac OS X 10.6.7.

Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ぽ尐不点ル 2024-11-14 22:45:19

在 Mac OS X 10.6.7 上,使用 ruby​​ r1.9.2,我收到与上面显示的相同的错误。但使用以下代码读取 CSV 文件适用于提供的示例 URL:

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

def read(url)
 CSV.new(open(url), :headers => :first_row).each do |line|
   puts line
   puts line[0]
   puts line['FEB11']
 end
end

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

On Mac OS X 10.6.7, using ruby r1.9.2, I get the same error as displayed above. But using the following code to read CSV files works for the example URL provided:

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

def read(url)
 CSV.new(open(url), :headers => :first_row).each do |line|
   puts line
   puts line[0]
   puts line['FEB11']
 end
end

read("http://www.euribor-ebf.eu/assets/modules/rateisblue/processed_files/myav_EURIBOR_2011.csv")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文