1

入力で 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() を試してみましたが、一度に値を読み取ることができましたが、その後は他のことを行うことができません。私の問題を解決するためのアドバイスはありますか?

敬具

4

2 に答える 2

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
)

オンラインデモ

于 2013-04-19T22:57:18.493 に答える