2012-07-16 3 views
2

Je travaille sur une mission où je récupère plusieurs cours des actions en ligne, en utilisant le système de prix des actions de Yahoo. Malheureusement, le Yahoo API que je suis requis d'utiliser renvoie un fichier .csv qui contient apparemment une ligne pour chaque jour où le stock a été échangé, ce qui est d'au moins 5 mille lignes pour les stocks que je travaille, et plus de 10 mille lignes pour certains d'entre eux (example).Comment puis-je obtenir rapidement une chaîne d'une des premières lignes d'un fichier CSV long sur une URL distante?

Je me soucie seulement du prix actuel, cependant, qui est dans la deuxième ligne.

Je suis en train de faire ceci:

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 

... mais il est vraiment lent.

  1. Est-ce que tout le délai provient de l'obtention du fichier, ou y en a-t-il dans la façon dont je le manipule? io.read lit le fichier entier?

  2. Existe-t-il un moyen de télécharger uniquement les premières lignes à partir du fichier Yahoo CSV?

  3. Si les réponses aux questions 1 & 2 ne rendent pas celui-ci hors de propos, est-il une meilleure façon de le traiter qui ne nécessite pas regarder le fichier entier (en supposant que est ce que io.read est en train de faire)?

+1

Cela semble suspicously comme: http: //stackoverflow.com/questions/1120350/how-to-download-via-http-only-piece-of -big-file-with-ruby – Jerdak

+0

La façon dont la commande open semble fonctionner est d'enregistrer d'abord la page Web téléchargée dans un fichier temporaire, puis de passer cet objet IO Tempfile au bloc donné. C'est à dire 'open (" http: // ... ") {| io | puts File.read (io.path)} 'affiche le contenu de la page Web téléchargée. Ainsi, la méthode 'open' télécharge le fichier entier avant même qu'il n'atteigne votre bloc. Malheureusement, je ne sais pas comment télécharger partiellement un fichier (je n'ai jamais eu besoin de le faire auparavant), donc je ne peux pas répondre 2 ou 3, mais je suis sûr que vous ne pourrez pas utiliser 'open' pour faire ce. –

+0

Vous pouvez réduire la taille du fichier en spécifiant la dernière date de transaction dans la chaîne de requête, si vous utilisez le service de devis. exemple: http://finance.yahoo.com/d/quotes.csv?s=MO&f=snd1l1yr Si vous pouvez utiliser cet autre service, plus d'infos ici: http://greenido.wordpress.com/ 2009/12/22/yahoo-finance-hidden-api/ – Tim

Répondre

3

Vous pouvez utiliser des paramètres de chaîne de requête pour réduire les données à la date actuelle, en utilisant les paramètres de plage de dates.

exemple pour MO le 13/07/2012: (début/fin du mois commence avec un index zéro, {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

Description api ici: http://etraderzone.com/free-scripts/47-historical-quotes-yahoo.html

+0

Merci, Tim! Cela a résolu mon problème, mais je vais attendre pendant un jour ou deux pour voir si quelqu'un d'autre peut trouver une façon de le faire, puisque c'était techniquement la question posée. :) –

+0

Le premier commentaire à votre question renvoie à une autre question SO où il est répondu. –

+0

@LarsHaugseth: Les deux réponses à cette question impliquent une manipulation de socket de bas niveau, ce qui, comme l'auteur de l'une des réponses l'a souligné, n'est pas vraiment une manière très Ruby pour résoudre le problème. Comme cette question date de 3 ans, j'ai pensé que ça valait la peine d'attendre un peu pour voir s'il y avait une solution plus propre maintenant (plusieurs versions de Ruby plus tard). –

Questions connexes