解析CSV与PHP
问题描述:
我是在PHP全新的,现在我尽量让私人网站,我读出了一些雅虎股票信息API
链接:finance.yahoo.com/d/quotes.csv?s=^GDAXI+^TECDAX+eurusd=x+gcf12.cmx+CLH12.NYM&f=nl1k2
链接工作正常,但现在怎么样我能读这个文件吗?并在我的页面上回显信息?
输出:
"DAX",6864.43,"+54.97 - +0.81%"
"TECDAX",775.33,"+3.78 - +0.49%"
"EUR to USD",1.3447,"N/A - 0.00%"
"Gold Jan 12",1731.80,"N/A - +0.32%"
"Crude Oil Mar 12",105.88,"N/A - +0.04%"
我需要什么:
echo $name;
echo $rate;
echo $change;
echo $changeinpercent;
我希望有人能帮助我,和SRY我的英语不好。
问候, 马蒂亚斯
答
你可以使用正则表达式从各行提取所需的信息。下面的php代码是你需要提取这个特定的数据。这是一个正则表达式的代码,你应该用的preg_match函数使用它:
/\"([^\"]+)\",(\d+\.\d+),\"(N\/A)?([+-]?\d+\.?\d+)?\s+-\s+([+-]?\d+\.?\d+%?)/
它给你一个数组,你会用它作为:
$match[0]
$match[1]
$match[2]
$match[3]
UPDATE:
这是代码做到这一点:
<?php
$csv=file_get_contents("http://finance.yahoo.com/d/quotes.csv?s=^GDAXI+^TECDAX+eurusd=x+gcf12.cmx+CLH12.NYM&f=nl1k2");
$rows=explode("\n", $csv);
for($i=0;$i<count($rows);$i++)
{
preg_match_all("/\"([^\"]+)\",(\d+\.\d+),\"(N\/A)?([+-]?\d+\.?\d+)?\s+-\s+([+-]?\d+\.?\d+%?)/", $rows[$i],$matches,PREG_SET_ORDER);
}
?>
它返回:
Array
(
[0] => Array
(
[0] => "DAX",6864.43,"+54.97 - +0.81%
[1] => DAX
[2] => 6864.43
[3] =>
[4] => +54.97
[5] => +0.81%
)
Array
(
[0] => Array
(
[0] => "Gold Jan 12",1731.80,"N/A - +0.32%
[1] => Gold Jan 12
[2] => 1731.80
[3] => N/A
[4] =>
[5] => +0.32%
)
)
如果是N/A你会发现它$匹配[3]中,如果在第4
答
如果您使用的是PHP5.3,则可以使用str_getcsv,但您仍然需要解析包含您正在查找的两个值(提示:explode)的最后一个字符串值。
如果你不是在PHP5.3,你应该能够使用fgetcsv与传递给它的流。
答
首先的值),应该看到手动here 然后,请参阅下面的代码粘贴为例子,
<?php
//
// Convert csv file to associative array:
//
function csv_to_array($input, $delimiter='|')
{
$header = null;
$data = array();
$csvData = str_getcsv($input, "\n");
foreach($csvData as $csvLine){
if(is_null($header)) $header = explode($delimiter, $csvLine);
else{
$items = explode($delimiter, $csvLine);
for($n = 0, $m = count($header); $n < $m; $n++){
$prepareData[$header[$n]] = $items[$n];
}
$data[] = $prepareData;
}
}
return $data;
}
//-----------------------------------
//
//Usage:
$csvArr = csv_to_array(file_get_contents('test.csv'));
?>
此代码应帮助你很多,但请将文件保存到CSV使用此function..and保存的文件是不强硬。并且代码的来源仍然是上面所述的link,您只需根据您的要求对其进行修改。
HTH
谢谢@戈登 – Sebastian 2012-02-25 21:42:16