审查视图

simplewind/vendor/phpoffice/phpexcel/unitTests/testDataFileIterator.php 3.7 KB
xiaohu authored
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
<?php

class testDataFileIterator implements Iterator
{

    protected $file;
    protected $key = 0;
    protected $current;

    public function __construct($file)
    {
        $this->file = fopen($file, 'r');
    }

    public function __destruct()
    {
        fclose($this->file);
    }

    public function rewind()
    {
        rewind($this->file);
        $this->current = $this->_parseNextDataset();
        $this->key = 0;
    }

    public function valid()
    {
        return !feof($this->file);
    }

    public function key()
    {
        return $this->key;
    }

    public function current()
    {
        return $this->current;
    }

    public function next()
    {
        $this->current = $this->_parseNextDataset();
        $this->key++;
    }

    private function _parseNextDataset()
    {
        //    Read a line of test data from the file
        do {
            //    Only take lines that contain test data and that aren't commented out
            $testDataRow = trim(fgets($this->file));
        } while (($testDataRow > '') && ($testDataRow{0} === '#'));

        //    Discard any comments at the end of the line
        list($testData) = explode('//',$testDataRow);

        //    Split data into an array of individual values and a result
        $dataSet = $this->_getcsv($testData, ',', "'");
        foreach($dataSet as &$dataValue) {
            $dataValue = $this->_parseDataValue($dataValue);
        }
        unset($dataValue);

        return $dataSet;
    }

    private function _getcsv($input, $delimiter, $enclosure)
    {
        if (function_exists('str_getcsv')) {
            return str_getcsv($input, $delimiter, $enclosure);
        }

        $temp = fopen('php://memory', 'rw');
        fwrite($temp, $input);
        rewind($temp);
        $data = fgetcsv($temp, strlen($input), $delimiter, $enclosure);
        fclose($temp);

        if ($data === false) {
            $data = array(null);
        }

        return $data;
    }

    private function _parseDataValue($dataValue) {
        //    discard any white space
        $dataValue = trim($dataValue);
        //    test for the required datatype and convert accordingly
        if (!is_numeric($dataValue)) {
            if($dataValue == '') {
                $dataValue = NULL;
            } elseif($dataValue == '""') {
                $dataValue = '';
            } elseif(($dataValue[0] == '"') && ($dataValue[strlen($dataValue)-1] == '"')) {
                $dataValue = substr($dataValue,1,-1);
            } elseif(($dataValue[0] == '{') && ($dataValue[strlen($dataValue)-1] == '}')) {
                $dataValue = explode(';',substr($dataValue,1,-1));
                foreach($dataValue as &$dataRow) {
                    if (strpos($dataRow,'|') !== FALSE) {
                        $dataRow = explode('|',$dataRow);
                        foreach($dataRow as &$dataCell) {
                            $dataCell = $this->_parseDataValue($dataCell);
                        }
                        unset($dataCell);
                    } else {
                        $dataRow = $this->_parseDataValue($dataRow);
                    }
                }
                unset($dataRow);
            } else {
                switch (strtoupper($dataValue)) {
                    case 'NULL' :  $dataValue = NULL; break;
                    case 'TRUE' :  $dataValue = TRUE; break;
                    case 'FALSE' : $dataValue = FALSE; break;
                }
            }
        } else {
            if (strpos($dataValue,'.') !== FALSE) {
                $dataValue = (float) $dataValue;
            } else {
                $dataValue = (int) $dataValue;
            }
        }

		return $dataValue;
    }

}