Blame view

backend/components/parsers/CsvParser.php 2.81 KB
1e991822   Mihail   csv parser with e...
1
2
3
4
5
6
7
8
  <?php
  /**
   * Created by PhpStorm.
   * User: Cibermag
   * Date: 26.08.2015
   * Time: 17:00
   */
  
b13b1c83   Mihail   final version par...
9
  namespace backend\components\parsers;
1e991822   Mihail   csv parser with e...
10
11
12
13
14
15
  
  use Yii;
  use yii\base\ErrorException;
  
  class CsvParser implements \IteratorAggregate {
  
1e991822   Mihail   csv parser with e...
16
17
18
19
  
      /** @var bool */
      private $hasHeaderRow;
  
1e991822   Mihail   csv parser with e...
20
      /** @var resource */
2957209c   Mihail   csv parser - add ...
21
      private $file;
1e991822   Mihail   csv parser with e...
22
23
24
25
  
      /** @var out encoding charset */
      private $out_charset = 'UTF-8';
      /** @var out encoding charset */
2957209c   Mihail   csv parser - add ...
26
      private $in_charset;
b13b1c83   Mihail   final version par...
27
      /** @var int - first line for parsing */
2957209c   Mihail   csv parser - add ...
28
      private $first_line;
1e991822   Mihail   csv parser with e...
29
  
b13b1c83   Mihail   final version par...
30
31
32
33
      /** @var int - first column for parsing */
      private $first_column;
  
      public function setup( $file, $first_line, $first_column, $hasHeaderRow = TRUE, $delimiter = ';')
1e991822   Mihail   csv parser with e...
34
      {
2957209c   Mihail   csv parser - add ...
35
  
5c710262   Mihail   edit csv parser -...
36
          $this->first_line = $first_line;
b13b1c83   Mihail   final version par...
37
          $this->first_column = $first_column;
5c710262   Mihail   edit csv parser -...
38
  
2957209c   Mihail   csv parser - add ...
39
40
41
42
43
44
          $this->file = $file;
  
          $this->file->setCsvControl($delimiter);
          $this->file->setFlags(\SplFileObject::READ_CSV);
          $this->file->seek( $this->first_line );
  
5c710262   Mihail   edit csv parser -...
45
  
2957209c   Mihail   csv parser - add ...
46
47
          $this->in_charset = 'windows-1251';
          $this->hasHeaderRow = $hasHeaderRow;
1e991822   Mihail   csv parser with e...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
      }
  
      public function getIterator()
      {
          return new \ArrayIterator($this->read());
      }
  
      /**
       * @return array
       * @throws InvalidFileException
       * @deprecated Use ::read instead.
       */
      public function parseAll()
      {
          return $this->read();
      }
  
      /**
       * @return array
       * @throws InvalidFileException
       */
      public function read()
      {
e91188dd   Mihail   add Encoder class
71
          // @todo add comments
1e991822   Mihail   csv parser with e...
72
73
          $return = [];
  
1e991822   Mihail   csv parser with e...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
          $line = 0;
          $keys = NULL;
  
          while (($row = $this->readRow()) !== FALSE) {
              $line++;
  
              if ($this->hasHeaderRow) {
                  if ($keys === NULL) {
                      $keys = array_values($row);
                  } else {
  
                      if (count($keys) !== count($row)) {
  //
                          Yii::warning("Invalid columns detected on line #$line .");
                          return $return;
                      }
  
                      $return[] = array_combine($keys, $row);
                  }
              } else {
                  $return[] = $row;
              }
          }
  
          $this->closeHandler();
  
          return $return;
      }
  
2957209c   Mihail   csv parser - add ...
103
  
1e991822   Mihail   csv parser with e...
104
105
      private function closeHandler()
      {
2957209c   Mihail   csv parser - add ...
106
          $this->file = NULL;
1e991822   Mihail   csv parser with e...
107
108
109
      }
  
      private function readRow()
e91188dd   Mihail   add Encoder class
110
          // @todo add comments
1e991822   Mihail   csv parser with e...
111
      {
2957209c   Mihail   csv parser - add ...
112
          $dirt_value_arr = $this->file->fgetcsv(  );
b13b1c83   Mihail   final version par...
113
          $dirt_value_arr = array_slice( $dirt_value_arr, $this->first_column );
e91188dd   Mihail   add Encoder class
114
          $clear_arr = Encoder::encodeArray( $this->in_charset, $this->out_charset, $dirt_value_arr );
e91188dd   Mihail   add Encoder class
115
          return $clear_arr;
1e991822   Mihail   csv parser with e...
116
117
118
  
      }
  
e91188dd   Mihail   add Encoder class
119
120
121
122
123
124
125
126
  //    private function encodeArray( $array_to_encode )
  //    {
  //        return array_map(function($array_to_encode) {
  //            return iconv( $this->in_charset, $this->out_charset, $array_to_encode );
  //        }, $array_to_encode);
  //
  //    }
  
1e991822   Mihail   csv parser with e...
127
128
  
  }