AbstractIteratorFile::__construct()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
nc 2
nop 1
dl 0
loc 8
ccs 5
cts 5
cp 1
crap 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace NwLaravel\Iterators;
4
5
/**
6
 * Abstract interação de arquivos, implementa o iterator para percorrer as linhas do arquivo
7
 */
8
abstract class AbstractIteratorFile implements \Iterator, \Countable
9
{
10
    /**
11
     * @var string
12
     */
13
    protected $fileName;
14
15
    /**
16
     * @var resource
17
     */
18
    protected $fileHandle;
19
20
    /**
21
     * @var mixed
22
     */
23
    protected $current;
24
25
    /**
26
     * @var int
27
     */
28
    protected $key;
29
30
    /**
31
     * @var int
32
     */
33
    protected $count;
34
35
    /**
36
     * Make Row Current
37
     *
38
     * @return mixed
39
     */
40
    abstract protected function makeCurrent();
41
42
    /**
43
     * Abre o arquivo para leitura
44
     *
45
     * @param string $fileName Path
46
     *
47
     * @throws \RuntimeException
48
     */
49 8
    public function __construct($fileName)
50
    {
51 8
        $this->fileName = (string) $fileName;
52
53 8
        if (!file_exists($fileName) || !$this->fileHandle = fopen($fileName, 'r')) {
54 1
            throw new \RuntimeException('Couldn\'t open file "' . $fileName . '"');
55
        }
56 7
    }
57
58
    /**
59
     * Contagem de linhas
60
     *
61
     * @return int
62
     */
63 1
    public function count()
64
    {
65 1
        if (is_null($this->count)) {
66 1
            $this->count = 0;
67 1
            $data = (array) stream_get_meta_data($this->fileHandle);
68 1
            if (isset($data['uri'])) {
69 1
                $this->count = intval(@exec("wc -l '".$data['uri']."'"));
70 1
            }
71 1
        }
72
73 1
        return $this->count;
74
    }
75
76
    /**
77
     * Inicia a leitura do arquivo do inicio
78
     *
79
     * @return void
80
     */
81 2
    public function rewind()
82
    {
83 2
        rewind($this->fileHandle);
84 2
        $this->key = -1;
85 2
        $this->next();
86 2
    }
87
88
    /**
89
     * Retorna o indice atual
90
     *
91
     * @return int
92
     */
93 1
    public function key()
94
    {
95 1
        return $this->key;
96
    }
97
98
    /**
99
     * Valida se havera proxima linha
100
     *
101
     * @return bool
102
     */
103 2
    public function valid()
104
    {
105 2
        return ($this->current !== false && !is_null($this->current));
106
    }
107
108
    /**
109
     * Retorna a linha atual
110
     *
111
     * @return string
112
     */
113 2
    public function current()
114
    {
115 2
        return $this->current;
116
    }
117
118
    /**
119
     * Busca a proxima linha
120
     *
121
     * @Make return void
122
     */
123 2
    public function next()
124
    {
125 2
        $this->current = $this->makeCurrent();
126 2
        $this->key++;
127 2
    }
128
129
    /**
130
     * Le alinha no arquivo, formata o encodig caso seja necessario
131
     *
132
     * @return string
133
     */
134 1
    protected function getLine()
135
    {
136 1
        $encoding = 'UTF-8';
137 1
        $line = false;
138
139 1
        if (! feof($this->fileHandle)) {
140 1
            $line = fgets($this->fileHandle);
141
142 1
            if ($line !== false) {
143 1
                $line = trim($line);
144 1
                if (mb_detect_encoding($line, $encoding, true) != $encoding) {
145 1
                    $line = utf8_encode($line);
146 1
                }
147 1
            }
148 1
        }
149
150 1
        return $line;
151
    }
152
153
    /**
154
     * Ao destruir fecha o arquivo
155
     *
156
     * @return void
157
     */
158 7
    public function __destruct()
159
    {
160 7
        if (is_resource($this->fileHandle)) {
161 7
            fclose($this->fileHandle);
162 7
        }
163 7
    }
164
}
165