Commit a684f314ab18562194ce5cd45eeda81afaebd5ad

Authored by Mihail
1 parent 58f734e6

add adjustRowToKeys function

Showing 2 changed files with 68 additions and 35 deletions   Show diff stats
lib/ParserValidator.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Tsurkanov
  5 + * Date: 25.11.2015
  6 + * Time: 16:11
  7 + */
  8 +
  9 +class ParserValidator {
  10 +
  11 +}
0 \ No newline at end of file 12 \ No newline at end of file
lib/TableParser.php
@@ -11,7 +11,8 @@ namespace yii\multiparser; @@ -11,7 +11,8 @@ namespace yii\multiparser;
11 11
12 use common\components\CustomVarDamp; 12 use common\components\CustomVarDamp;
13 13
14 -abstract class TableParser extends Parser { 14 +abstract class TableParser extends Parser
  15 +{
15 16
16 17
17 /** 18 /**
@@ -39,7 +40,7 @@ abstract class TableParser extends Parser { @@ -39,7 +40,7 @@ abstract class TableParser extends Parser {
39 * используется при автоопределении первой строки*/ 40 * используется при автоопределении первой строки*/
40 public $min_column_quantity = 5; 41 public $min_column_quantity = 5;
41 /** @var int - количество пустых строк, что бы определить конец файла, 42 /** @var int - количество пустых строк, что бы определить конец файла,
42 - такое количеество подряд пустых строк считается концом файла*/ 43 + * такое количеество подряд пустых строк считается концом файла*/
43 public $empty_lines_quantity = 3; 44 public $empty_lines_quantity = 3;
44 45
45 46
@@ -64,11 +65,11 @@ abstract class TableParser extends Parser { @@ -64,11 +65,11 @@ abstract class TableParser extends Parser {
64 65
65 // будем считать количество пустых строк подряд - при достижении $empty_lines_quantity - считаем что это конец файла и выходим 66 // будем считать количество пустых строк подряд - при достижении $empty_lines_quantity - считаем что это конец файла и выходим
66 $empty_lines = 0; 67 $empty_lines = 0;
67 - while ( $empty_lines < $this->empty_lines_quantity ) { 68 + while ($empty_lines < $this->empty_lines_quantity) {
68 // прочтем строку из файла 69 // прочтем строку из файла
69 $this->readRow(); 70 $this->readRow();
70 71
71 - if ( $this->isEmptyRow() ) { 72 + if ($this->isEmptyRow()) {
72 //счетчик пустых строк 73 //счетчик пустых строк
73 //CustomVarDamp::dump($this->current_row_number); 74 //CustomVarDamp::dump($this->current_row_number);
74 $empty_lines++; 75 $empty_lines++;
@@ -76,21 +77,24 @@ abstract class TableParser extends Parser { @@ -76,21 +77,24 @@ abstract class TableParser extends Parser {
76 } 77 }
77 78
78 // уберем пустые колонки из ряда 79 // уберем пустые колонки из ряда
79 - $this->filterRow(); 80 + if ($this->keys === NULL) {
  81 + $this->filterRow();
  82 + }
  83 +
80 84
81 - $this->adjustRowToSettings( ); 85 + $this->adjustRowToSettings();
82 86
83 // строка не пустая, имеем прочитанный массив значений 87 // строка не пустая, имеем прочитанный массив значений
84 $this->current_row_number++; 88 $this->current_row_number++;
85 89
86 // для первой строки утановим ключи из заголовка 90 // для первой строки утановим ключи из заголовка
87 - if ( !$this->setKeysFromHeader() ) { 91 + if (!$this->setKeysFromHeader()) {
88 $this->setResult(); 92 $this->setResult();
89 } 93 }
90 94
91 95
92 // если у нас установлен лимит, при его достижении прекращаем парсинг 96 // если у нас установлен лимит, при его достижении прекращаем парсинг
93 - if ( $this->isLastLine() ) 97 + if ($this->isLastLine())
94 break; 98 break;
95 99
96 // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД 100 // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД
@@ -99,6 +103,7 @@ abstract class TableParser extends Parser { @@ -99,6 +103,7 @@ abstract class TableParser extends Parser {
99 } 103 }
100 104
101 } 105 }
  106 +
102 /** 107 /**
103 * определяет первую значимую строку, 108 * определяет первую значимую строку,
104 * считывается файл пока в нем не встретится строка с непустыми колонками 109 * считывается файл пока в нем не встретится строка с непустыми колонками
@@ -107,12 +112,12 @@ abstract class TableParser extends Parser { @@ -107,12 +112,12 @@ abstract class TableParser extends Parser {
107 */ 112 */
108 protected function shiftToFirstValuableLine() 113 protected function shiftToFirstValuableLine()
109 { 114 {
110 - do { 115 + do {
111 116
112 $this->current_row_number++; 117 $this->current_row_number++;
113 $this->readRow(); 118 $this->readRow();
114 119
115 - } while( $this->isEmptyRow() ); 120 + } while ($this->isEmptyRow());
116 121
117 // @todo - сделать опционально 122 // @todo - сделать опционально
118 // код для того что бы парсить первую строку, закомментировано как предполагается что первая значимая строка это заголовок 123 // код для того что бы парсить первую строку, закомментировано как предполагается что первая значимая строка это заголовок
@@ -123,59 +128,76 @@ abstract class TableParser extends Parser { @@ -123,59 +128,76 @@ abstract class TableParser extends Parser {
123 /** 128 /**
124 * @return array - одномерный массив результата парсинга строки 129 * @return array - одномерный массив результата парсинга строки
125 */ 130 */
126 - protected function adjustRowToSettings( ) 131 + protected function adjustRowToSettings()
127 { 132 {
128 133
129 - // если есть заголовок, то перед конвертацией его нужно назначить  
130 - if ( $this->keys !== NULL ) {  
131 -  
132 - if (count($this->keys) !== count($this->row)) {  
133 - throw new \Exception("Ошибка парсинга файла в строке # {$this->current_row_number}.  
134 - Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными");  
135 - }  
136 -  
137 - $this->row = array_combine($this->keys, $this->row);  
138 - } 134 + // если есть заголовок, то перед конвертацией его нужно назначить
  135 + if ($this->keys !== NULL) {
  136 + // adjust row to keys
  137 + $this->adjustRowToKeys();
  138 + // назначим заголовок
  139 + $this->row = array_combine($this->keys, $this->row);
  140 + }
139 141
140 - // попытаемся конвертировать прочитанные значения согласно конфигурации котнвертера значений  
141 - $this->row = $this->convert($this->row); 142 + // попытаемся конвертировать прочитанные значения согласно конфигурации котнвертера значений
  143 + $this->row = $this->convert($this->row);
142 144
143 - // обрежем массив к первой значимой колонке  
144 - if ( $this->first_column ) { 145 + // обрежем массив к первой значимой колонке
  146 + if ($this->first_column) {
145 147
146 - $this->row = array_slice($this->row, $this->first_column); 148 + $this->row = array_slice($this->row, $this->first_column);
147 149
148 - } 150 + }
149 151
150 } 152 }
151 153
152 - protected function setKeysFromHeader(){  
153 - if ( $this->has_header_row ) { 154 + protected function setKeysFromHeader()
  155 + {
  156 + if ($this->has_header_row) {
154 // в файле есть заголовок, но он еще не назначен - назначим 157 // в файле есть заголовок, но он еще не назначен - назначим
155 if ($this->keys === NULL) { 158 if ($this->keys === NULL) {
156 - $this->keys = array_values( $this->row ); 159 + $this->keys = array_values($this->row);
157 return true; 160 return true;
158 } 161 }
159 } 162 }
160 return false; 163 return false;
161 } 164 }
162 165
163 - protected function filterRow(){ 166 + protected function filterRow()
  167 + {
164 // если есть заголовок - все значения нужны, не фильтруем 168 // если есть заголовок - все значения нужны, не фильтруем
165 - if ( $this->has_header_row || !is_array( $this->row ) ) { 169 + if ($this->has_header_row || !is_array($this->row)) {
166 return; 170 return;
167 } 171 }
168 - $this->row = array_filter( $this->row, function($val){ 172 + $this->row = array_filter($this->row, function ($val) {
169 return !$this->isEmptyColumn($val); 173 return !$this->isEmptyColumn($val);
170 }); 174 });
171 } 175 }
172 176
173 - protected function isLastLine(){ 177 + protected function isLastLine()
  178 + {
174 179
175 - if ( ( $this->last_line ) && ( $this->current_row_number > $this->last_line ) ) { 180 + if (($this->last_line) && ($this->current_row_number > $this->last_line)) {
176 return true; 181 return true;
177 } 182 }
178 return false; 183 return false;
179 } 184 }
180 185
  186 + protected function adjustRowToKeys()
  187 + {
  188 + //уберем из ряда те колонки которых нет в ключах
  189 + $this->row = array_intersect_key($this->row, $this->keys);
  190 +
  191 + $keys_count = count($this->keys);
  192 + $column_count = count($this->row);
  193 + if ($keys_count != $column_count) {
  194 + // найдем колонки которых нет в ряде но есть ключах
  195 + $arr_diff = array_diff_key($this->keys, $this->row);
  196 + foreach ($arr_diff as $key => $value) {
  197 + // колонки которых нет в ряде но есть ключах, добавим их с пустым значением
  198 + $this->row[$key] = '';
  199 + }
  200 + }
  201 + }
  202 +
181 } 203 }
182 \ No newline at end of file 204 \ No newline at end of file