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
  
6efcd4fa   Mihail   edit csv parser -...
33
34
          $this->first_line = $first_line;
  
095562a1   Mihail   csv parser - add ...
35
36
37
38
39
40
          $this->file = $file;
  
          $this->file->setCsvControl($delimiter);
          $this->file->setFlags(\SplFileObject::READ_CSV);
          $this->file->seek( $this->first_line );
  
6efcd4fa   Mihail   edit csv parser -...
41
  
095562a1   Mihail   csv parser - add ...
42
43
          $this->in_charset = 'windows-1251';
          $this->hasHeaderRow = $hasHeaderRow;
d0d39eaf   Mihail   csv parser with e...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
      }
  
      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
67
          // @todo add comments
d0d39eaf   Mihail   csv parser with e...
68
69
          $return = [];
  
d0d39eaf   Mihail   csv parser with e...
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
97
98
          $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 ...
99
  
d0d39eaf   Mihail   csv parser with e...
100
101
      private function closeHandler()
      {
095562a1   Mihail   csv parser - add ...
102
          $this->file = NULL;
d0d39eaf   Mihail   csv parser with e...
103
104
105
      }
  
      private function readRow()
8b105e42   Mihail   add Encoder class
106
          // @todo add comments
d0d39eaf   Mihail   csv parser with e...
107
      {
095562a1   Mihail   csv parser - add ...
108
          $dirt_value_arr = $this->file->fgetcsv(  );
8b105e42   Mihail   add Encoder class
109
110
          $dirt_value_arr = array_slice( $dirt_value_arr, 2 );
          $clear_arr = Encoder::encodeArray( $this->in_charset, $this->out_charset, $dirt_value_arr );
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
  
  }