【问题标题】:PHP get CSV from URL, load into array, formatPHP 从 URL 获取 CSV,加载到数组,格式化
【发布时间】:2014-10-13 20:03:21
【问题描述】:

我正在尝试编写一个脚本,以 csv 格式从 yahoo Finance 下载历史数据。我的脚本成功地将数据加载到一个数组中,但我遇到了两个问题。首先是,尽管创建了一个从雅虎提取的日期范围,但我一直在获取该股票的全部历史数据,我不确定为什么。我只希望从当天算起过去 6 个月。其次,我能够使用 str_getcsv 将数据加载到一个数组中,但是我无法创建一个循环来将其设置在一个表中,第一行是表列的标题,其余部分是有组织的按行中的日期。

代码如下:

<?php

$stock = "AAPL";
$date = strtotime(date('Y-m-d') . ' -1 month');
$date2 = strtotime(date('Y-m-d') . ' -6 months');

$a = (date('m', $date));
$b = (date('d', $date));
$c =(date('Y', $date));
$d = (date('m', $date2));
$e = (date('d', $date2));
$f =(date('Y', $date2));

 $s = str_getcsv(file_get_contents("http://ichart.yahoo.com/table.csv?s=$stock&a=$d&b=e&c=$f&d=$a&e=$b&f=$c&g=d"));


Stock:echo $stock;

echo '<pre>';
print_r($s);
echo '</pre>';
?>

这是输出:

AAPL

Array
(
    [0] => Date
    [1] => Open
    [2] => High
    [3] => Low
    [4] => Close
    [5] => Volume
    [6] => Adj Close
2014-10-10
    [7] => 100.69
    [8] => 102.03
    [9] => 100.30
    [10] => 100.73
    [11] => 66270200
    [12] => 100.73
2014-10-09
    [13] => 101.54
    [14] => 102.38
    [15] => 100.61
    [16] => 101.02
    [17] => 77312200
    [18] => 101.02
2014-10-08
    [19] => 98.76
    [20] => 101.11
    [21] => 98.31
    [22] => 100.80
    [23] => 57364800
    [24] => 100.80
2014-10-07
    [25] => 99.43
    [26] => 100.12
    [27] => 98.73
    [28] => 98.75
    [29] => 42068200
    [30] => 98.75

等等……

任何帮助将不胜感激!

【问题讨论】:

    标签: php arrays loops csv


    【解决方案1】:

    您错过了b=e 中网址中的美元符号。这是按行获取它的代码:

    $data = file_get_contents("http://ichart.yahoo.com/table.csv?s=$stock&a=$d&b=$e&c=$f&d=$a&e=$b&f=$c&g=d");
    $rows = explode("\n",$data);
    $s = array();
    foreach($rows as $row) {
        $s[] = str_getcsv($row);
    }
    

    【讨论】:

    • 谢谢!我不敢相信我错过了美元符号……我一定是因为某种复杂的原因而努力寻找,我完全错过了明显的原因
    • 但有时$rows = explode(PHP_EOL, $data); 更好。
    【解决方案2】:
    如果新行存在,

    PHP_EOL"\n" 可能会意外结束 $rows

    $file = "http://ichart.yahoo.com/table.csv?s=$stock&a=$d&b=$e&c=$f&d=$a&e=$b&f=$c&g=d";
    
    $fileData=fopen($file,'r');
    while (($line = fgetcsv($fileData)) !== FALSE) {
    
       $s[] = $line;
    }
    echo "<pre>";
    var_dump($s);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多