Blame view

backend/components/parsers/CsvParser.php 2.94 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
30
  
  
1e991822   Mihail   csv parser with e...
31
  
1e991822   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
       */
2957209c   Mihail   csv parser - add ...
50
      public function setup( $file, $first_line = 1, $hasHeaderRow = TRUE, $delimiter = ';')
1e991822   Mihail   csv parser with e...
51
      {
2957209c   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;
1e991822   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 = [];
  
1e991822   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;
      }
  
2957209c   Mihail   csv parser - add ...
116
  
1e991822   Mihail   csv parser with e...
117
118
      private function closeHandler()
      {
2957209c   Mihail   csv parser - add ...
119
          $this->file = NULL;
1e991822   Mihail   csv parser with e...
120
121
122
123
      }
  
      private function readRow()
      {
2957209c   Mihail   csv parser - add ...
124
125
126
127
          $dirt_value_arr = $this->file->fgetcsv(  );
          $encode_arr = $this->encodeArray( $dirt_value_arr );
  
          return $encode_arr;
1e991822   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);
  
      }
  
  
  }