Commit cd8b9f70e71a504b61f7ba46ab66f662730141e8
1 parent
0c6fd004
add cleanUp method to Parser class
Showing
7 changed files
with
59 additions
and
38 deletions
Show diff stats
lib/CsvParser.php
| @@ -34,6 +34,8 @@ class CsvParser extends TableParser | @@ -34,6 +34,8 @@ class CsvParser extends TableParser | ||
| 34 | { | 34 | { |
| 35 | parent::read(); | 35 | parent::read(); |
| 36 | 36 | ||
| 37 | + $this->cleanUp(); | ||
| 38 | + | ||
| 37 | return $this->result; | 39 | return $this->result; |
| 38 | } | 40 | } |
| 39 | 41 | ||
| @@ -54,6 +56,10 @@ class CsvParser extends TableParser | @@ -54,6 +56,10 @@ class CsvParser extends TableParser | ||
| 54 | $j = 0; | 56 | $j = 0; |
| 55 | for ($i = 1; $i <= count( $this->row ); $i++) { | 57 | for ($i = 1; $i <= count( $this->row ); $i++) { |
| 56 | 58 | ||
| 59 | + if ( !isset( $this->row[ $i - 1 ] ) ) { | ||
| 60 | + continue; | ||
| 61 | + } | ||
| 62 | + | ||
| 57 | if ( $this->isEmptyColumn( $this->row[$i - 1] ) ) { | 63 | if ( $this->isEmptyColumn( $this->row[$i - 1] ) ) { |
| 58 | $j++; | 64 | $j++; |
| 59 | } | 65 | } |
| @@ -70,4 +76,8 @@ class CsvParser extends TableParser | @@ -70,4 +76,8 @@ class CsvParser extends TableParser | ||
| 70 | protected function isEmptyColumn( $val ){ | 76 | protected function isEmptyColumn( $val ){ |
| 71 | return $val == ''; | 77 | return $val == ''; |
| 72 | } | 78 | } |
| 79 | + | ||
| 80 | + protected function setResult( ){ | ||
| 81 | + $this->result[] = $this->row; | ||
| 82 | + } | ||
| 73 | } | 83 | } |
| 74 | \ No newline at end of file | 84 | \ No newline at end of file |
lib/Parser.php
| @@ -17,6 +17,9 @@ abstract class Parser | @@ -17,6 +17,9 @@ abstract class Parser | ||
| 17 | public $converter_conf = []; | 17 | public $converter_conf = []; |
| 18 | protected $converter = NULL; | 18 | protected $converter = NULL; |
| 19 | 19 | ||
| 20 | + /** @var экземляр SplFileObject читаемого файла */ | ||
| 21 | + public $file; | ||
| 22 | + | ||
| 20 | /** | 23 | /** |
| 21 | * @var array - результирующий массив с отпарсенными значениями | 24 | * @var array - результирующий массив с отпарсенными значениями |
| 22 | */ | 25 | */ |
| @@ -28,9 +31,15 @@ abstract class Parser | @@ -28,9 +31,15 @@ abstract class Parser | ||
| 28 | /** @var bool | 31 | /** @var bool |
| 29 | имеет ли файл заголовок который будет установлен ключами возвращемого массива*/ | 32 | имеет ли файл заголовок который будет установлен ключами возвращемого массива*/ |
| 30 | public $has_header_row = false; | 33 | public $has_header_row = false; |
| 34 | + /* | ||
| 35 | + *если есть ключи, то колонки с пустыми значениями будут пропускаться (из ряда такие значения будут удаляться), | ||
| 36 | + * например если в файле вторая колонка пустая то она будет удалена | ||
| 37 | + * если есть $has_header_row - то первая значимая строка становится ключами, но пустые колонки не удаляются из ряда | ||
| 38 | + * например если в файле вторая колонка пустая то ей будет назначен соответсвующий ключ (второй) из первой строки | ||
| 39 | + * все описаное выше реализуется в дочернем семействе классов TableParser в методе filterRow() | ||
| 40 | + * для xml происходит просто сопоставление переданных ключей с прочитанными | ||
| 41 | + */ | ||
| 31 | 42 | ||
| 32 | - /** @var экземляр SplFileObject читаемого файла */ | ||
| 33 | - public $file; | ||
| 34 | 43 | ||
| 35 | 44 | ||
| 36 | 45 | ||
| @@ -78,4 +87,14 @@ abstract class Parser | @@ -78,4 +87,14 @@ abstract class Parser | ||
| 78 | return $arr; | 87 | return $arr; |
| 79 | 88 | ||
| 80 | } | 89 | } |
| 90 | + | ||
| 91 | + protected function cleanUp( ) | ||
| 92 | + { | ||
| 93 | + unset( $this->file ); | ||
| 94 | + unset( $this->converter ); | ||
| 95 | + unset( $this->converter_conf ); | ||
| 96 | + | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + | ||
| 81 | } | 100 | } |
| 82 | \ No newline at end of file | 101 | \ No newline at end of file |
lib/ParserHandler.php
| @@ -60,24 +60,12 @@ class ParserHandler | @@ -60,24 +60,12 @@ class ParserHandler | ||
| 60 | 60 | ||
| 61 | public function run() | 61 | public function run() |
| 62 | { | 62 | { |
| 63 | - $result = []; | ||
| 64 | - if (count($this->custom_configuration)) { | 63 | + $parser = $this->createObjectByConfiguration( $this->custom_configuration ); |
| 65 | 64 | ||
| 66 | - $parser = $this->createObjectByConfiguration($this->custom_configuration); | ||
| 67 | - | ||
| 68 | - try { | ||
| 69 | - | ||
| 70 | - $parser->setup(); | ||
| 71 | - $result = $parser->read(); | ||
| 72 | - | ||
| 73 | - } catch (\ErrorException $e) { | ||
| 74 | - | ||
| 75 | - echo $e->getMessage(); | ||
| 76 | - | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - } | 65 | + $parser->setup(); |
| 66 | + $result = $parser->read(); | ||
| 80 | 67 | ||
| 68 | + unset($this->fileObject); | ||
| 81 | return $result; | 69 | return $result; |
| 82 | } | 70 | } |
| 83 | 71 | ||
| @@ -106,6 +94,10 @@ class ParserHandler | @@ -106,6 +94,10 @@ class ParserHandler | ||
| 106 | { | 94 | { |
| 107 | return ObjectCreator::build($configuration); | 95 | return ObjectCreator::build($configuration); |
| 108 | } | 96 | } |
| 97 | + | ||
| 98 | + | ||
| 99 | + | ||
| 100 | + | ||
| 109 | } | 101 | } |
| 110 | 102 | ||
| 111 | 103 |
lib/TableParser.php
| @@ -94,11 +94,8 @@ abstract class TableParser extends Parser { | @@ -94,11 +94,8 @@ abstract class TableParser extends Parser { | ||
| 94 | // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД | 94 | // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД |
| 95 | $empty_lines = 0; | 95 | $empty_lines = 0; |
| 96 | 96 | ||
| 97 | - | ||
| 98 | - | ||
| 99 | } | 97 | } |
| 100 | 98 | ||
| 101 | - | ||
| 102 | } | 99 | } |
| 103 | /** | 100 | /** |
| 104 | * определяет первую значимую строку, | 101 | * определяет первую значимую строку, |
| @@ -131,7 +128,8 @@ abstract class TableParser extends Parser { | @@ -131,7 +128,8 @@ abstract class TableParser extends Parser { | ||
| 131 | if ( $this->keys !== NULL ) { | 128 | if ( $this->keys !== NULL ) { |
| 132 | 129 | ||
| 133 | if (count($this->keys) !== count($this->row)) { | 130 | if (count($this->keys) !== count($this->row)) { |
| 134 | - throw new \Exception("Ошибка парсинга файла в строке # {$this->current_row_number}. Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными"); | 131 | + throw new \Exception("Ошибка парсинга файла в строке # {$this->current_row_number}. |
| 132 | + Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными"); | ||
| 135 | } | 133 | } |
| 136 | 134 | ||
| 137 | $this->row = array_combine($this->keys, $this->row); | 135 | $this->row = array_combine($this->keys, $this->row); |
| @@ -161,15 +159,13 @@ abstract class TableParser extends Parser { | @@ -161,15 +159,13 @@ abstract class TableParser extends Parser { | ||
| 161 | } | 159 | } |
| 162 | 160 | ||
| 163 | protected function filterRow(){ | 161 | protected function filterRow(){ |
| 164 | - // если есть заголовок или ключи - все значения нужны, не фильтруем | ||
| 165 | - if ( $this->has_header_row || $this->keys !== NULL ) { | 162 | + // если есть заголовок - все значения нужны, не фильтруем |
| 163 | + if ( $this->has_header_row || $this->row === NULL ) { | ||
| 166 | return; | 164 | return; |
| 167 | } | 165 | } |
| 168 | - // CustomVarDamp::dump( $this->row); | ||
| 169 | $this->row = array_filter( $this->row, function($val){ | 166 | $this->row = array_filter( $this->row, function($val){ |
| 170 | return !$this->isEmptyColumn($val); | 167 | return !$this->isEmptyColumn($val); |
| 171 | }); | 168 | }); |
| 172 | - //CustomVarDamp::dump( $this->row); | ||
| 173 | } | 169 | } |
| 174 | 170 | ||
| 175 | protected function isLastLine(){ | 171 | protected function isLastLine(){ |
lib/XlsxParser.php
| @@ -62,18 +62,13 @@ class XlsxParser extends TableParser { | @@ -62,18 +62,13 @@ class XlsxParser extends TableParser { | ||
| 62 | $this->current_node = $xml->sheetData->row; | 62 | $this->current_node = $xml->sheetData->row; |
| 63 | $this->current_node->rewind(); | 63 | $this->current_node->rewind(); |
| 64 | if ( $this->current_node->valid() ) { | 64 | if ( $this->current_node->valid() ) { |
| 65 | - | ||
| 66 | parent::read(); | 65 | parent::read(); |
| 67 | - | ||
| 68 | } | 66 | } |
| 69 | - | ||
| 70 | } | 67 | } |
| 71 | - | ||
| 72 | } | 68 | } |
| 73 | 69 | ||
| 74 | - | 70 | + $this->cleanUp(); |
| 75 | if ( $this->active_sheet ) { | 71 | if ( $this->active_sheet ) { |
| 76 | - | ||
| 77 | // в настройках указан конкретный лист с которогшо будем производить чтение, поэтому и возвращаем подмассив | 72 | // в настройках указан конкретный лист с которогшо будем производить чтение, поэтому и возвращаем подмассив |
| 78 | return $this->result[ $this->current_sheet ]; | 73 | return $this->result[ $this->current_sheet ]; |
| 79 | }else{ | 74 | }else{ |
| @@ -90,7 +85,6 @@ class XlsxParser extends TableParser { | @@ -90,7 +85,6 @@ class XlsxParser extends TableParser { | ||
| 90 | throw new \Exception( 'Ошибка создания временного каталога - ' . $this->path_for_extract_files ); | 85 | throw new \Exception( 'Ошибка создания временного каталога - ' . $this->path_for_extract_files ); |
| 91 | } | 86 | } |
| 92 | 87 | ||
| 93 | - | ||
| 94 | $zip = new \ZipArchive; | 88 | $zip = new \ZipArchive; |
| 95 | if ( $zip->open( $this->file->getPathname() ) === TRUE ) { | 89 | if ( $zip->open( $this->file->getPathname() ) === TRUE ) { |
| 96 | $zip->extractTo( $this->path_for_extract_files . '/' ); | 90 | $zip->extractTo( $this->path_for_extract_files . '/' ); |
| @@ -226,9 +220,16 @@ class XlsxParser extends TableParser { | @@ -226,9 +220,16 @@ class XlsxParser extends TableParser { | ||
| 226 | } | 220 | } |
| 227 | } | 221 | } |
| 228 | 222 | ||
| 229 | - function __destruct() | 223 | + |
| 224 | + protected function cleanUp() | ||
| 230 | { | 225 | { |
| 226 | + parent::cleanUp(); | ||
| 227 | + unset($this->strings_arr); | ||
| 228 | + unset($this->sheets_arr); | ||
| 229 | + unset($this->current_node); | ||
| 230 | + | ||
| 231 | $this->deleteExtractFiles(); | 231 | $this->deleteExtractFiles(); |
| 232 | + | ||
| 232 | } | 233 | } |
| 233 | 234 | ||
| 234 | 235 |
lib/XmlParser.php
| @@ -24,16 +24,17 @@ class XmlParser extends Parser{ | @@ -24,16 +24,17 @@ class XmlParser extends Parser{ | ||
| 24 | 24 | ||
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | + $this->cleanUp(); | ||
| 27 | return $result; | 28 | return $result; |
| 28 | } | 29 | } |
| 29 | 30 | ||
| 30 | 31 | ||
| 31 | /** | 32 | /** |
| 32 | * Converts an XML string to a PHP array | 33 | * Converts an XML string to a PHP array |
| 33 | - * | ||
| 34 | - * @uses recursiveXMLToArray() | ||
| 35 | - * @param string $file_path | ||
| 36 | - * @return array | 34 | + * @param $file_path |
| 35 | + * @return mixed | ||
| 36 | + * @throws Exception | ||
| 37 | + * @throws \Exception | ||
| 37 | */ | 38 | */ |
| 38 | protected function xmlToArray( $file_path ) { | 39 | protected function xmlToArray( $file_path ) { |
| 39 | 40 |
lib/YiiMultiparser.php
| @@ -17,6 +17,7 @@ class YiiMultiparser extends Component{ | @@ -17,6 +17,7 @@ class YiiMultiparser extends Component{ | ||
| 17 | 17 | ||
| 18 | public $configuration; | 18 | public $configuration; |
| 19 | public $parserHandler; | 19 | public $parserHandler; |
| 20 | +public $filePath; | ||
| 20 | 21 | ||
| 21 | public function init() | 22 | public function init() |
| 22 | { | 23 | { |
| @@ -29,6 +30,7 @@ public $parserHandler; | @@ -29,6 +30,7 @@ public $parserHandler; | ||
| 29 | 30 | ||
| 30 | public function parse( $filePath, $options = [] ){ | 31 | public function parse( $filePath, $options = [] ){ |
| 31 | 32 | ||
| 33 | + $this->filePath = $filePath; | ||
| 32 | $this->parserHandler->setup( $filePath, $options ); | 34 | $this->parserHandler->setup( $filePath, $options ); |
| 33 | 35 | ||
| 34 | return $this->parserHandler->run(); | 36 | return $this->parserHandler->run(); |