Blame view

backend/components/parsers/CsvParser.php 2.64 KB
1e991822   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 {
  
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;
1e991822   Mihail   csv parser with e...
27
      /** @var out encoding charset */
2957209c   Mihail   csv parser - add ...
28
      private $first_line;
1e991822   Mihail   csv parser with e...
29
  
e91188dd   Mihail   add Encoder class
30
      public function setup( $file, $first_line, $hasHeaderRow = TRUE, $delimiter = ';')
1e991822   Mihail   csv parser with e...
31
      {
2957209c   Mihail   csv parser - add ...
32
  
5c710262   Mihail   edit csv parser -...
33
34
          $this->first_line = $first_line;
  
2957209c   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 );
  
5c710262   Mihail   edit csv parser -...
41
  
2957209c   Mihail   csv parser - add ...
42
43
          $this->in_charset = 'windows-1251';
          $this->hasHeaderRow = $hasHeaderRow;
1e991822   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()
      {
e91188dd   Mihail   add Encoder class
67
          // @todo add comments
1e991822   Mihail   csv parser with e...
68
69
          $return = [];
  
1e991822   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;
      }
  
2957209c   Mihail   csv parser - add ...
99
  
1e991822   Mihail   csv parser with e...
100
101
      private function closeHandler()
      {
2957209c   Mihail   csv parser - add ...
102
          $this->file = NULL;
1e991822   Mihail   csv parser with e...
103
104
105
      }
  
      private function readRow()
e91188dd   Mihail   add Encoder class
106
          // @todo add comments
1e991822   Mihail   csv parser with e...
107
      {
2957209c   Mihail   csv parser - add ...
108
          $dirt_value_arr = $this->file->fgetcsv(  );
e91188dd   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 );
e91188dd   Mihail   add Encoder class
111
          return $clear_arr;
1e991822   Mihail   csv parser with e...
112
113
114
  
      }
  
e91188dd   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);
  //
  //    }
  
1e991822   Mihail   csv parser with e...
123
124
  
  }