Blame view

backend/components/parsers/CsvParser.php 2.94 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
30
  
  
d0d39eaf   Mihail   csv parser with e...
31
  
d0d39eaf   Mihail   csv parser with e...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  
  //    public function encodeFile( $in_charset, $out_charset, $filePath ){
  //
  //        $old_content = file_get_contents( $filePath );
  //        $encode_content = iconv( $in_charset, $out_charset, $old_content );
  //        $file = @fopen( $filePath, "w" );
  //        fwrite( $file, $encode_content );
  //        @fclose( $file );
  //
  //    }
  
  
      /**
       * @param string $delimiter
       * @param string $enclosure
       * @param string $escape
       * @return $this
       */
095562a1   Mihail   csv parser - add ...
50
      public function setup( $file, $first_line = 1, $hasHeaderRow = TRUE, $delimiter = ';')
d0d39eaf   Mihail   csv parser with e...
51
      {
095562a1   Mihail   csv parser - add ...
52
53
54
55
56
57
58
59
60
61
  
          $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...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
      }
  
      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()
      {
          $return = [];
  
d0d39eaf   Mihail   csv parser with e...
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
          $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 ...
116
  
d0d39eaf   Mihail   csv parser with e...
117
118
      private function closeHandler()
      {
095562a1   Mihail   csv parser - add ...
119
          $this->file = NULL;
d0d39eaf   Mihail   csv parser with e...
120
121
122
123
      }
  
      private function readRow()
      {
095562a1   Mihail   csv parser - add ...
124
125
126
127
          $dirt_value_arr = $this->file->fgetcsv(  );
          $encode_arr = $this->encodeArray( $dirt_value_arr );
  
          return $encode_arr;
d0d39eaf   Mihail   csv parser with e...
128
129
130
131
132
133
134
135
136
137
138
139
140
  
      }
  
      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);
  
      }
  
  
  }