You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.8 KiB
131 lines
3.8 KiB
<?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; |
|
} |
|
|
|
}
|
|
|