Commit 04c37836f566d85e37961c1232957cefd3c57e4c
1 parent
17693af2
add draft version of detect function
Showing
2 changed files
with
46 additions
and
20 deletions
 
Show diff stats
backend/components/parsers/CsvParser.php
| ... | ... | @@ -13,51 +13,71 @@ use Yii; | 
| 13 | 13 | use yii\base\ErrorException; | 
| 14 | 14 | use common\components\debug\CustomVarDamp; | 
| 15 | 15 | |
| 16 | -class CsvParser implements \IteratorAggregate { | |
| 16 | +class CsvParser { | |
| 17 | 17 | |
| 18 | 18 | |
| 19 | 19 | /** @var bool */ | 
| 20 | - private $hasHeaderRow; | |
| 20 | + public $hasHeaderRow = false; | |
| 21 | 21 | |
| 22 | 22 | /** @var resource */ | 
| 23 | - private $file; | |
| 23 | + public $file; | |
| 24 | 24 | |
| 25 | 25 | /** @var out encoding charset */ | 
| 26 | - private $out_charset = 'UTF-8'; | |
| 26 | + public $out_charset = 'UTF-8'; | |
| 27 | 27 | /** @var out encoding charset */ | 
| 28 | - private $in_charset; | |
| 28 | + public $in_charset = 'windows-1251'; | |
| 29 | 29 | /** @var int - first line for parsing */ | 
| 30 | - private $first_line; | |
| 30 | + public $first_line = 0; | |
| 31 | 31 | |
| 32 | 32 | /** @var int - first column for parsing */ | 
| 33 | - private $first_column; | |
| 33 | + public $first_column = 0; | |
| 34 | 34 | |
| 35 | 35 | /** @var array - array of headers values */ | 
| 36 | - private $keys; | |
| 36 | + public $keys; | |
| 37 | + public $delimiter = ';'; | |
| 38 | + public $auto_detect_start_position = false; | |
| 39 | + public $min_column_quantity = 5; | |
| 37 | 40 | |
| 38 | - public function setup( $file, $first_line, $first_column, $hasHeaderRow = false, $delimiter = ';') | |
| 39 | - { | |
| 40 | - | |
| 41 | - $this->first_line = $first_line; | |
| 42 | - $this->first_column = $first_column; | |
| 43 | 41 | |
| 44 | - $this->file = $file; | |
| 42 | + public function setup() | |
| 43 | + { | |
| 45 | 44 | |
| 46 | - $this->file->setCsvControl($delimiter); | |
| 45 | + if ($this->auto_detect_start_position) { | |
| 46 | + $this->first_line = $this->detectStartPosition(); | |
| 47 | + } | |
| 48 | + CustomVarDamp::dumpAndDie( $this->first_line ); | |
| 49 | + $this->file->setCsvControl($this->$delimiter); | |
| 47 | 50 | $this->file->setFlags(\SplFileObject::READ_CSV); | 
| 48 | 51 | $this->file->seek( $this->first_line ); | 
| 49 | 52 | |
| 50 | 53 | |
| 51 | - $this->in_charset = 'windows-1251'; | |
| 52 | - $this->hasHeaderRow = $hasHeaderRow; | |
| 53 | 54 | } | 
| 54 | 55 | |
| 55 | - public function getIterator() | |
| 56 | + | |
| 57 | + | |
| 58 | + protected function detectStartPosition () | |
| 56 | 59 | { | 
| 57 | - return new \ArrayIterator($this->read()); | |
| 58 | - } | |
| 60 | + $first_column = 0; | |
| 61 | + $find = false; | |
| 62 | + while (!$find) { | |
| 63 | + | |
| 64 | + $j = 0; | |
| 65 | + $row = $this->readRow(); | |
| 66 | + $first_column++; | |
| 67 | + for ($i = 1; $i<=count($row); $i++) { | |
| 68 | + if (!$row[$i]) { | |
| 69 | + $j++; | |
| 70 | + } | |
| 71 | + if ( $j >= $this->min_column_quantity ) { | |
| 72 | + $find = true; | |
| 73 | + break; | |
| 74 | + } | |
| 75 | + } | |
| 76 | + } | |
| 59 | 77 | |
| 78 | + return $first_column; | |
| 60 | 79 | |
| 80 | + } | |
| 61 | 81 | |
| 62 | 82 | /** | 
| 63 | 83 | * @return array | ... | ... | 
backend/components/parsers/ParserHandler.php
| 1 | 1 | <?php | 
| 2 | 2 | namespace backend\components\parsers; | 
| 3 | +use common\components\debug\CustomVarDamp; | |
| 3 | 4 | |
| 4 | 5 | use Yii; | 
| 5 | 6 | |
| ... | ... | @@ -42,6 +43,11 @@ class ParserHandler { | 
| 42 | 43 | $first_line = isset( $this->options->first_line )? $this->options->first_line : 0; | 
| 43 | 44 | $first_column = isset( $this->options->first_column )? $this->options->first_column : 0; | 
| 44 | 45 | |
| 46 | + $csvParser = Yii::createObject([ | |
| 47 | + 'class' => 'backend\components\parsers\CsvParser', | |
| 48 | + 'file' => $this->fileObject, | |
| 49 | + ]); | |
| 50 | + //CustomVarDamp::dumpAndDie($csvParser); | |
| 45 | 51 | $csvParser = new CsvParser( ); | 
| 46 | 52 | $csvParser->setup( $this->fileObject, $first_line, $first_column ); | 
| 47 | 53 | ... | ... |