Blame view

backend/components/parsers/CsvParser.php 2.81 KB
d0d39eaf   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
   */
  
febcec0b   Mihail   final version par...
9
  namespace backend\components\parsers;
d0d39eaf   Mihail   csv parser with e...
10
11
12
13
14
15
  
  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;
febcec0b   Mihail   final version par...
27
      /** @var int - first line for parsing */
095562a1   Mihail   csv parser - add ...
28
      private $first_line;
d0d39eaf   Mihail   csv parser with e...
29
  
febcec0b   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 = ';')
d0d39eaf   Mihail   csv parser with e...
34
      {
095562a1   Mihail   csv parser - add ...
35
  
6efcd4fa   Mihail   edit csv parser -...
36
          $this->first_line = $first_line;
febcec0b   Mihail   final version par...
37
          $this->first_column = $first_column;
6efcd4fa   Mihail   edit csv parser -...
38
  
095562a1   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 );
  
6efcd4fa   Mihail   edit csv parser -...
45
  
095562a1   Mihail   csv parser - add ...
46
47
          $this->in_charset = 'windows-1251';
          $this->hasHeaderRow = $hasHeaderRow;
d0d39eaf   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()
      {
8b105e42   Mihail   add Encoder class
71
          // @todo add comments
d0d39eaf   Mihail   csv parser with e...
72
73
          $return = [];
  
d0d39eaf   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;
      }
  
095562a1   Mihail   csv parser - add ...
103
  
d0d39eaf   Mihail   csv parser with e...
104
105
      private function closeHandler()
      {
095562a1   Mihail   csv parser - add ...
106
          $this->file = NULL;
d0d39eaf   Mihail   csv parser with e...
107
108
109
      }
  
      private function readRow()
8b105e42   Mihail   add Encoder class
110
          // @todo add comments
d0d39eaf   Mihail   csv parser with e...
111
      {
095562a1   Mihail   csv parser - add ...
112
          $dirt_value_arr = $this->file->fgetcsv(  );
febcec0b   Mihail   final version par...
113
          $dirt_value_arr = array_slice( $dirt_value_arr, $this->first_column );
8b105e42   Mihail   add Encoder class
114
          $clear_arr = Encoder::encodeArray( $this->in_charset, $this->out_charset, $dirt_value_arr );
8b105e42   Mihail   add Encoder class
115
          return $clear_arr;
d0d39eaf   Mihail   csv parser with e...
116
117
118
  
      }
  
8b105e42   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);
  //
  //    }
  
d0d39eaf   Mihail   csv parser with e...
127
128
  
  }