【问题标题】:How can I QUICKLY get a string from one of the first couple lines of a long CSV at a remote URL?如何从远程 URL 的长 CSV 的前几行中快速获取字符串?
【发布时间】:2012-07-16 03:16:07
【问题描述】:

我正在执行一项任务,我使用雅虎的股票价格系统从网上检索多个股票价格。不幸的是,Yahoo API 我需要使用返回一个 .csv 文件,该文件显然包含每天交易股票的一行,对于我正在使用的股票至少有 5000 行,甚至更多其中一些有 10000 行 (example)。

不过,我只关心当前的价格,它在第二行。

我目前正在这样做:

require 'open-uri'
def get_ticker_price(stock)
   open("http://ichart.finance.yahoo.com/table.csv?s=#{stock}") do |io|
      io.read.split(',')[10].to_f
   end
end

…但它真的很慢。

  1. 是所有延迟都来自获取文件,还是我处理它的方式有一些延迟? io.read 是否正在读取整个文件?

  2. 有没有办法只下载 Yahoo CSV 文件的前几行?

  3. 如果问题 1 和 2 的答案没有使这一个无关紧要,有没有更好的方法来处理它,不需要查看整个文件(假设这是 io.read 正在做的) ?

【问题讨论】:

  • 这听起来很可疑:stackoverflow.com/questions/1120350/…
  • open 命令的工作方式似乎是首先将下载的网页保存到一个临时文件,然后将该 Tempfile IO 对象传递给给定的块。即open("http://...") { |io| puts File.read(io.path) } 输出下载网页的内容。因此,open 方法会在整个文件到达您的块之前下载整个文件。不幸的是,我不知道如何部分下载文件(以前从不需要这样做),所以我无法回答 2 或 3,但是我很确定您将无法使用 open 来做这个。
  • 如果您使用报价服务,您可以通过在查询字符串中指定最后交易日期来减小文件大小。示例:finance.yahoo.com/d/quotes.csv?s=MO&f=snd1l1yr 如果您可以使用此其他服务,请在此处了解更多信息:greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api
  • 实际上,我为您正在使用的服务找到了更好的参考。这是获取今天数据的示例:ichart.finance.yahoo.com/…

标签: ruby csv open-uri


【解决方案1】:

您可以使用查询字符串参数将数据减少到当前日期,通过使用日期范围参数。

2012 年 7 月 13 日 MO 的示例:(开始/结束月份以零索引开始,{ 00 - 11 })。

http://ichart.finance.yahoo.com/table.csv?s=MO&a=06&b=13&c=2012&d=6&e=13&f=2012&g=d

这里的api描述: http://etraderzone.com/free-scripts/47-historical-quotes-yahoo.html

【讨论】:

  • 谢谢,蒂姆!这解决了我的问题,但我将推迟一两天接受它,看看是否有其他人能想出一种 Ruby 方式来做这件事,因为这是技术上的问题问。 :)
  • 对您问题的第一条评论链接到另一个已回答的 SO 问题。
  • @LarsHaugseth:该问题中的两个答案都需要低级套接字操作,正如其中一个答案的作者所指出的那样,这并不是解决问题的真正 Ruby 方法.由于这个问题已经存在 3 年了,我认为可能值得等待一下,看看现在是否有更清洁的解决方案可用(稍后有几个 Ruby 版本)。
  • 看起来运行该服务的服务器不支持“Range”HTTP 请求标头,因此使用纯 HTTP 库执行此操作可能不走运。
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2019-05-12
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多