Commit 2957209c807bb2c385b52d2f11c9aaca1e4f2af0

Authored by Mihail
1 parent 1e38ed08

csv parser - add fist line parametr

backend/components/parsers/CsvParser.php
@@ -13,41 +13,22 @@ use yii\base\ErrorException; @@ -13,41 +13,22 @@ use yii\base\ErrorException;
13 13
14 class CsvParser implements \IteratorAggregate { 14 class CsvParser implements \IteratorAggregate {
15 15
16 - /** @var string */  
17 - private $filePath;  
18 16
19 /** @var bool */ 17 /** @var bool */
20 private $hasHeaderRow; 18 private $hasHeaderRow;
21 19
22 - /** @var string */  
23 - private $delimiter;  
24 -  
25 - /** @var string */  
26 - private $enclosure;  
27 -  
28 - /** @var string */  
29 - private $escape;  
30 -  
31 /** @var resource */ 20 /** @var resource */
32 - private $handler; 21 + private $file;
33 22
34 /** @var out encoding charset */ 23 /** @var out encoding charset */
35 private $out_charset = 'UTF-8'; 24 private $out_charset = 'UTF-8';
36 /** @var out encoding charset */ 25 /** @var out encoding charset */
37 - public $in_charset; 26 + private $in_charset;
38 /** @var out encoding charset */ 27 /** @var out encoding charset */
39 - public $first_line; 28 + private $first_line;
40 29
41 30
42 - public function __construct($filePath, $first_line = 0,$hasHeaderRow = TRUE)  
43 - {  
44 31
45 - $this->in_charset = 'windows-1251';  
46 - $this->filePath = $filePath;  
47 - $this->hasHeaderRow = $hasHeaderRow;  
48 - $this->first_line = $first_line;  
49 -  
50 - }  
51 32
52 // public function encodeFile( $in_charset, $out_charset, $filePath ){ 33 // public function encodeFile( $in_charset, $out_charset, $filePath ){
53 // 34 //
@@ -66,9 +47,18 @@ class CsvParser implements \IteratorAggregate { @@ -66,9 +47,18 @@ class CsvParser implements \IteratorAggregate {
66 * @param string $escape 47 * @param string $escape
67 * @return $this 48 * @return $this
68 */ 49 */
69 - public function setup($delimiter = ';', $enclosure = '"', $escape = '\\') 50 + public function setup( $file, $first_line = 1, $hasHeaderRow = TRUE, $delimiter = ';')
70 { 51 {
71 - $this->handler->setCsvControl($delimiter); 52 +
  53 + $this->file = $file;
  54 +
  55 + $this->file->setCsvControl($delimiter);
  56 + $this->file->setFlags(\SplFileObject::READ_CSV);
  57 + $this->file->seek( $this->first_line );
  58 +
  59 + $this->first_line = $first_line;
  60 + $this->in_charset = 'windows-1251';
  61 + $this->hasHeaderRow = $hasHeaderRow;
72 } 62 }
73 63
74 public function getIterator() 64 public function getIterator()
@@ -94,8 +84,6 @@ class CsvParser implements \IteratorAggregate { @@ -94,8 +84,6 @@ class CsvParser implements \IteratorAggregate {
94 { 84 {
95 $return = []; 85 $return = [];
96 86
97 - $this->openHandler();  
98 -  
99 $line = 0; 87 $line = 0;
100 $keys = NULL; 88 $keys = NULL;
101 89
@@ -125,26 +113,18 @@ class CsvParser implements \IteratorAggregate { @@ -125,26 +113,18 @@ class CsvParser implements \IteratorAggregate {
125 return $return; 113 return $return;
126 } 114 }
127 115
128 - private function openHandler()  
129 - {  
130 - try {  
131 - $this->handler = new \SplFileObject( $this->filePath , 'r' );;  
132 - } catch (ErrorException $e) {  
133 - Yii::warning("Ошибка открытия файла {$this->filePath}");  
134 - }  
135 - $this->handler->setFlags(\SplFileObject::READ_CSV);// | \SplFileObject::READ_AHEAD | \SplFileObject::SKIP_EMPTY | \SplFileObject::DROP_NEW_LINE);  
136 - $this->handler->fseek( $this->first_line );  
137 - $this->setup();  
138 - } 116 +
139 private function closeHandler() 117 private function closeHandler()
140 { 118 {
141 - $this->handler = NULL; 119 + $this->file = NULL;
142 } 120 }
143 121
144 private function readRow() 122 private function readRow()
145 { 123 {
146 - $dirt_value_arr = $this->handler->fgetcsv( );  
147 - return $this->encodeArray( $dirt_value_arr ); 124 + $dirt_value_arr = $this->file->fgetcsv( );
  125 + $encode_arr = $this->encodeArray( $dirt_value_arr );
  126 +
  127 + return $encode_arr;
148 128
149 } 129 }
150 130
backend/components/parsers/ParserHandler.php
@@ -8,25 +8,39 @@ class ParserHandler { @@ -8,25 +8,39 @@ class ParserHandler {
8 /** @var string */ 8 /** @var string */
9 private $filePath; 9 private $filePath;
10 10
11 - /** @var string */ 11 + /** @var instance of SplFileObject */
  12 + private $fileObject;
  13 +
  14 + /** @var string - extension of file $filePath */
12 private $extension; 15 private $extension;
13 16
  17 + /** @var string - extension of file $filePath */
  18 + private $first_line;
  19 +
14 /** 20 /**
15 - * @param string $filePath parsing file path 21 + * @param string first line in file for parsing
16 */ 22 */
17 - public function __construct( $filePath ) 23 + public function __construct( $filePath, $first_line )
18 { 24 {
19 $this->filePath = $filePath; 25 $this->filePath = $filePath;
20 - preg_match( '/\.[^\.]+$/i',$filePath, $resultArray );  
21 - $this->extension = $resultArray[0]; 26 + $this->first_line = $first_line;
  27 +
  28 + try {
  29 + $this->fileObject = new \SplFileObject( $this->filePath , 'r' );;
  30 + } catch (ErrorException $e) {
  31 + Yii::warning("Ошибка открытия файла {$this->filePath}");
  32 + }
22 33
  34 + //preg_match( '/\.[^\.]+$/i',$filePath, $resultArray );
  35 + $this->extension = $this->fileObject->getExtension();
23 $this->run(); 36 $this->run();
24 } 37 }
25 38
26 public function run(){ 39 public function run(){
27 - if ($this->extension = '.csv'){ 40 + if ($this->extension = 'csv'){
28 41
29 - $csvParser = new CsvParser( $this->filePath ); 42 + $csvParser = new CsvParser( );
  43 + $csvParser->setup( $this->fileObject, $this->first_line );
30 return $csvParser->read(); 44 return $csvParser->read();
31 }; 45 };
32 } 46 }
backend/controllers/ParserController.php
@@ -63,7 +63,7 @@ class ParserController extends Controller @@ -63,7 +63,7 @@ class ParserController extends Controller
63 $filePath = Yii::getAlias('@webroot') . '/uploads/' . $model->file->baseName . '.' . $model->file->extension; 63 $filePath = Yii::getAlias('@webroot') . '/uploads/' . $model->file->baseName . '.' . $model->file->extension;
64 $model->file->saveAs( $filePath ); 64 $model->file->saveAs( $filePath );
65 65
66 - $parser = new ParserHandler( $filePath ); 66 + $parser = new ParserHandler( $filePath, 0 );
67 $data = $parser->run(); 67 $data = $parser->run();
68 68
69 if( !is_array($data) ){ 69 if( !is_array($data) ){