Blame view

backend/components/parsers/CsvParser.php 2.64 KB
d0d39eaf   Mihail   csv parser with e...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <?php
  /**
   * Created by PhpStorm.
   * User: Cibermag
   * Date: 26.08.2015
   * Time: 17:00
   */
  
  namespace app\components\parsers;
  
  use Yii;
  use yii\base\ErrorException;
  
  class CsvParser implements \IteratorAggregate {
  
d0d39eaf   Mihail   csv parser with e...
16
17
18
19
  
      /** @var bool */
      private $hasHeaderRow;
  
d0d39eaf   Mihail   csv parser with e...
20
      /** @var resource */
095562a1   Mihail   csv parser - add ...
21
      private $file;
d0d39eaf   Mihail   csv parser with e...
22
23
24
25
  
      /** @var out encoding charset */
      private $out_charset = 'UTF-8';
      /** @var out encoding charset */
095562a1   Mihail   csv parser - add ...
26
      private $in_charset;
d0d39eaf   Mihail   csv parser with e...
27
      /** @var out encoding charset */
095562a1   Mihail   csv parser - add ...
28
      private $first_line;
d0d39eaf   Mihail   csv parser with e...
29
  
8b105e42   Mihail   add Encoder class
30
      public function setup( $file, $first_line, $hasHeaderRow = TRUE, $delimiter = ';')
d0d39eaf   Mihail   csv parser with e...
31
      {
095562a1   Mihail   csv parser - add ...
32
33
34
35
36
37
38
39
40
41
  
          $this->file = $file;
  
          $this->file->setCsvControl($delimiter);
          $this->file->setFlags(\SplFileObject::READ_CSV);
          $this->file->seek( $this->first_line );
  
          $this->first_line = $first_line;
          $this->in_charset = 'windows-1251';
          $this->hasHeaderRow = $hasHeaderRow;
d0d39eaf   Mihail   csv parser with e...
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
      }
  
      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()
      {
8b105e42   Mihail   add Encoder class
65
          // @todo add comments
d0d39eaf   Mihail   csv parser with e...
66
67
          $return = [];
  
d0d39eaf   Mihail   csv parser with e...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
          $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;
      }
  
095562a1   Mihail   csv parser - add ...
97
  
d0d39eaf   Mihail   csv parser with e...
98
99
      private function closeHandler()
      {
095562a1   Mihail   csv parser - add ...
100
          $this->file = NULL;
d0d39eaf   Mihail   csv parser with e...
101
102
103
      }
  
      private function readRow()
8b105e42   Mihail   add Encoder class
104
          // @todo add comments
d0d39eaf   Mihail   csv parser with e...
105
      {
095562a1   Mihail   csv parser - add ...
106
          $dirt_value_arr = $this->file->fgetcsv(  );
095562a1   Mihail   csv parser - add ...
107
  
8b105e42   Mihail   add Encoder class
108
109
          $dirt_value_arr = array_slice( $dirt_value_arr, 2 );
          $clear_arr = Encoder::encodeArray( $this->in_charset, $this->out_charset, $dirt_value_arr );
d0d39eaf   Mihail   csv parser with e...
110
  
8b105e42   Mihail   add Encoder class
111
          return $clear_arr;
d0d39eaf   Mihail   csv parser with e...
112
113
114
  
      }
  
8b105e42   Mihail   add Encoder class
115
116
117
118
119
120
121
122
  //    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);
  //
  //    }
  
d0d39eaf   Mihail   csv parser with e...
123
124
  
  }