我在输入中获得了一个csv文件,这是内容的一个例子:
TIME,Value
2010,77.77046
2010,60.32812
2010Q1,63.33447
2010Q2,61.29888
2010Q3,59.06448
2010Q4,57.62415
2011,60.75586
2011Q1,60.97929
2011Q2,61.36082
2011Q3,59.88779
2011Q4,60.79407
这是我用来获取csv的代码,读取内容并将其放入数组中。
if (($handle = fopen("csvExtractTor.csv", "r")) !== FALSE) {
# Set the parent multidimensional array key to 0.
$nn = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
# Count the total keys in the row.
$c = count($data);
# Populate the multidimensional array.
for ($x=0;$x<$c;$x++)
{
$brim[$nn][$x] = $data[$x];
}
$nn++;
}
# Close the File.
fclose($handle);
};
我需要的是采取每个季度的价值,例如,2010Q1,2010Q2,2010Q3,2010Q4,将它和和/ 4分别作为媒介,并将操作保存到2010年的独特价值,进入csv或变量。我已经尝试了很多解决方案,但没有一个好。我尝试了方法strpos(),我每次只能读取一个值,但之后我不能做其他事情。 有没有人建议解决我的问题?
亲切的问候
答案 0 :(得分:3)
$brim = array();
$years = array();
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$brim[] = $data;
if (preg_match('/^(\d{4})Q(\d)/', $data[0], $match)) {
$years[$match[1]][$match[2]] = $data[1];
}
}
foreach ($years as &$year) {
$year['avg'] = $avg = array_sum($year)/count($year);
}
在此之后,$years[2010]['avg']
将包含2010年每个季度的平均值。
print_r($years);
Array
(
[2010] => Array
(
[1] => 63.33447
[2] => 61.29888
[3] => 59.06448
[4] => 57.62415
[avg] => 60.330495
)
[2011] => Array
(
[1] => 60.97929
[2] => 61.36082
[3] => 59.88779
[4] => 60.79407
[avg] => 60.7554925
)
)
答案 1 :(得分:1)
这应该做的工作:
// $csv = file_get_contents('file.csv');
$csv = 'TIME,Value
2010,77.77046
2010,60.32812
2010Q1,63.33447
2010Q2,61.29888
2010Q3,59.06448
2010Q4,57.62415
2011,60.75586
2011Q1,60.97929
2011Q2,61.36082
2011Q3,59.88779
2011Q4,60.79407';
$array = array();
preg_replace_callback('/((\d{4})Q\d),(\d+(?:\.\d+))/', function($matches) use(&$array){
if(isset($array[$matches[2]])){
$array[$matches[2]] += ($matches[3]/4);
}else{
$array[$matches[2]] = ($matches[3]/4);
}
return($matches[1]);
},$csv);
print_r($array);
输出:
Array
(
[2010] => 60.330495
[2011] => 60.7554925
)