Ruby 1.9.2 - 读取和解析远程 CSV

Posted

技术标签:

【中文标题】Ruby 1.9.2 - 读取和解析远程 CSV【英文标题】:Ruby 1.9.2 - Read and parse a remote CSV 【发布时间】:2011-08-25 16:43:37 【问题描述】:

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

我在 Internet 上发现了几个使用 FasterCSV 的有趣示例,它们在 ruby​​ 1.9.2 中已合并到 CSV 中。我发现您可以通过这种方式使用 gem '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

有什么建议吗?

【问题讨论】:

嗯 ... CSV 可能有问题吗?你能给我你试过的网址吗?谢谢 如果没有人可以重现您的问题,那么提供解决方案也无济于事,我们也没有评论依据。 我可以重现它,很明显。请尝试使用此 URL:euribor-ebf.eu/assets/modules/rateisblue/processed_files/… 好的,谢谢,但它仍然有效,在 ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.7.0] b>ruby 1.9.2p180(2011-02-18 修订版 30909)[x86_64-darwin10.7.0] 发布有关错误的更多信息可能会有所帮助。 【参考方案1】:

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

【讨论】:

太棒了。这现在工作正常!我没有尝试 CSV.new() 方法。 太棒了,这真的节省了我的时间。 CSV.new(open(url)) 如果你 linter 抱怨 open 的安全问题,你可以用 URI.parse(url).open 替换它。

以上是关于Ruby 1.9.2 - 读取和解析远程 CSV的主要内容,如果未能解决你的问题,请参考以下文章

csv表格处理(下)--纯JS解析导入csv

ruby读取csv文件数据

ruby读取csv行数

Ruby/Rails CSV 解析,UTF-8 中的无效字节序列

ruby 解析CSV-不同的方式

ruby 解析CSV-不同的方式