1e991822
Mihail
csv parser with e...
|
1
2
|
<?php
/**
|
1e991822
Mihail
csv parser with e...
|
3
|
|
40ff24a1
Mihail
refactor CsvParse...
|
4
|
*/
|
036717a1
Mihail
add error excepti...
|
5
|
namespace yii\multiparser;
|
dc10d651
Mihail
add value filter ...
|
6
|
|
1e991822
Mihail
csv parser with e...
|
7
|
|
474f35bf
Mihail
add DynamicFormHe...
|
8
9
10
11
|
/**
* Class CsvParser
* @package yii\multiparser
*/
|
37656b1f
Mihail
add parser interf...
|
12
|
class CsvParser implements ParserInterface
|
999b9326
Mihail
add detectStartPo...
|
13
|
{
|
1e991822
Mihail
csv parser with e...
|
14
|
|
1e991822
Mihail
csv parser with e...
|
15
|
|
40ff24a1
Mihail
refactor CsvParse...
|
16
17
|
/** @var bool
имеет ли файл заголовок который будет установлен ключами возвращемого массива*/
|
e55d56cc
Mihail
add draft version...
|
18
|
public $hasHeaderRow = false;
|
40ff24a1
Mihail
refactor CsvParse...
|
19
20
21
|
/** @var array - массив с заголовком,
* если не указан и установлено свойство $hasHeaderRow - будет определен автоматически */
public $keys;
|
1e991822
Mihail
csv parser with e...
|
22
|
|
40ff24a1
Mihail
refactor CsvParse...
|
23
|
/** @var экземляр SplFileObject читаемого файла */
|
e55d56cc
Mihail
add draft version...
|
24
|
public $file;
|
1e991822
Mihail
csv parser with e...
|
25
|
|
40ff24a1
Mihail
refactor CsvParse...
|
26
|
/** @var int - первая строка с которой начинать парсить */
|
e55d56cc
Mihail
add draft version...
|
27
|
public $first_line = 0;
|
1e991822
Mihail
csv parser with e...
|
28
|
|
40ff24a1
Mihail
refactor CsvParse...
|
29
30
31
32
33
|
/** @var int - последняя строка до которой парсить
* если не указана, то парсинг происходит до конца файла*/
public $last_line = 0;
/** @var int - первая колонка файла с которой начнется парсинг */
|
e55d56cc
Mihail
add draft version...
|
34
|
public $first_column = 0;
|
b13b1c83
Mihail
final version par...
|
35
|
|
40ff24a1
Mihail
refactor CsvParse...
|
36
|
/** @var string - разделитель csv */
|
e55d56cc
Mihail
add draft version...
|
37
|
public $delimiter = ';';
|
40ff24a1
Mihail
refactor CsvParse...
|
38
39
40
41
42
43
44
45
|
/** @var bool
нужно ли искать автоматически первоую значисмую строку (не пустая строка)
* иначе первая строка будет взята из аттрибута $first_line */
public $auto_detect_first_line = false;
/** @var int - количество значимых колонок, что бы определить первую значимую строку
* используется при автоопределении первой строки*/
|
e55d56cc
Mihail
add draft version...
|
46
|
public $min_column_quantity = 5;
|
dc10d651
Mihail
add value filter ...
|
47
|
|
5c710262
Mihail
edit csv parser -...
|
48
|
|
474f35bf
Mihail
add DynamicFormHe...
|
49
|
|
40ff24a1
Mihail
refactor CsvParse...
|
50
51
52
|
/**
метод устанвливает нужные настройки объекта SplFileObject, для работы с csv
*/
|
e55d56cc
Mihail
add draft version...
|
53
54
|
public function setup()
{
|
999b9326
Mihail
add detectStartPo...
|
55
56
57
|
$this->file->setCsvControl($this->delimiter);
$this->file->setFlags(\SplFileObject::READ_CSV);
$this->file->setFlags(\SplFileObject::SKIP_EMPTY);
|
40ff24a1
Mihail
refactor CsvParse...
|
58
59
|
if ($this->auto_detect_first_line) {
$this->shiftToFirstValuableLine();
|
e55d56cc
Mihail
add draft version...
|
60
|
}
|
1e991822
Mihail
csv parser with e...
|
61
62
|
}
|
40ff24a1
Mihail
refactor CsvParse...
|
63
64
65
66
67
68
69
|
/**
* определяет первую значимую строку,
* считывается файл пока в нем не встретится строка с непустыми колонками
* в количестве указанном в атрибуте min_column_quantity
* в результате выполнения курсор ресурса будет находится на последней незначимой строке
*/
protected function shiftToFirstValuableLine()
|
e55d56cc
Mihail
add draft version...
|
70
|
{
|
e55d56cc
Mihail
add draft version...
|
71
|
|
40ff24a1
Mihail
refactor CsvParse...
|
72
73
74
|
$finish = false;
while (!$finish) {
|
999b9326
Mihail
add detectStartPo...
|
75
76
|
$j = 0;
$row = $this->readRow();
|
999b9326
Mihail
add detectStartPo...
|
77
78
|
if ($row === false) {
continue;
|
e55d56cc
Mihail
add draft version...
|
79
|
}
|
999b9326
Mihail
add detectStartPo...
|
80
|
|
999b9326
Mihail
add detectStartPo...
|
81
82
83
84
85
86
87
|
for ($i = 1; $i <= count($row); $i++) {
if ($row[$i - 1] <> '') {
$j++;
}
if ($j >= $this->min_column_quantity) {
|
40ff24a1
Mihail
refactor CsvParse...
|
88
|
break 2;
|
999b9326
Mihail
add detectStartPo...
|
89
|
}
|
e55d56cc
Mihail
add draft version...
|
90
91
|
}
}
|
e55d56cc
Mihail
add draft version...
|
92
|
}
|
1e991822
Mihail
csv parser with e...
|
93
94
|
/**
|
40ff24a1
Mihail
refactor CsvParse...
|
95
96
|
* @return array - итоговый двумерный массив с результатом парсинга
* метод считывает с открытого файла данные построчно
|
1e991822
Mihail
csv parser with e...
|
97
98
99
|
*/
public function read()
{
|
1e991822
Mihail
csv parser with e...
|
100
|
$return = [];
|
40ff24a1
Mihail
refactor CsvParse...
|
101
102
|
$current_line = 0;
|
e774f057
Mihail
work with custome...
|
103
|
//$this->keys = NULL;
|
40ff24a1
Mihail
refactor CsvParse...
|
104
|
|
1e991822
Mihail
csv parser with e...
|
105
|
while (($row = $this->readRow()) !== FALSE) {
|
40ff24a1
Mihail
refactor CsvParse...
|
106
|
$current_line++;
|
1e991822
Mihail
csv parser with e...
|
107
108
|
if ($this->hasHeaderRow) {
|
dc10d651
Mihail
add value filter ...
|
109
110
|
if ($this->keys === NULL) {
$this->keys = array_values($row);
|
1e991822
Mihail
csv parser with e...
|
111
112
|
} else {
|
dc10d651
Mihail
add value filter ...
|
113
|
if (count($this->keys) !== count($row)) {
|
1e991822
Mihail
csv parser with e...
|
114
|
//
|
036717a1
Mihail
add error excepti...
|
115
|
throw new \ErrorException( "Invalid columns detected on line # {$current_line}", 0, 1, $this->file->getBasename(), $current_line);
|
1e991822
Mihail
csv parser with e...
|
116
117
|
}
|
dc10d651
Mihail
add value filter ...
|
118
|
$return[] = array_combine($this->keys, $row);
|
1e991822
Mihail
csv parser with e...
|
119
|
}
|
40ff24a1
Mihail
refactor CsvParse...
|
120
121
122
|
}
else
{
|
1e991822
Mihail
csv parser with e...
|
123
124
|
$return[] = $row;
}
|
40ff24a1
Mihail
refactor CsvParse...
|
125
126
|
// если у нас установлен лимит, при его достижении прекращаем парсинг
if (($this->last_line) && ($current_line > $this->last_line)) {
|
999b9326
Mihail
add detectStartPo...
|
127
128
129
|
break;
}
|
1e991822
Mihail
csv parser with e...
|
130
131
132
|
}
$this->closeHandler();
|
1e991822
Mihail
csv parser with e...
|
133
134
135
|
return $return;
}
|
2957209c
Mihail
csv parser - add ...
|
136
|
|
474f35bf
Mihail
add DynamicFormHe...
|
137
|
|
dfeb2d10
Mihail
edit universal cs...
|
138
|
protected function closeHandler()
|
1e991822
Mihail
csv parser with e...
|
139
|
{
|
2957209c
Mihail
csv parser - add ...
|
140
|
$this->file = NULL;
|
1e991822
Mihail
csv parser with e...
|
141
142
|
}
|
40ff24a1
Mihail
refactor CsvParse...
|
143
144
145
|
/**
* @return array - одномерный массив результата парсинга строки
*/
|
dfeb2d10
Mihail
edit universal cs...
|
146
|
protected function readRow()
|
1e991822
Mihail
csv parser with e...
|
147
|
{
|
dfeb2d10
Mihail
edit universal cs...
|
148
|
|
999b9326
Mihail
add detectStartPo...
|
149
|
$row = $this->file->fgetcsv();
|
40ff24a1
Mihail
refactor CsvParse...
|
150
151
152
153
|
if (is_array($row) && $this->first_column) {
$row = array_slice($row, $this->first_column);
|
dfeb2d10
Mihail
edit universal cs...
|
154
|
}
|
999b9326
Mihail
add detectStartPo...
|
155
156
|
if (is_null($row))
$row = false;
|
dc10d651
Mihail
add value filter ...
|
157
|
|
dfeb2d10
Mihail
edit universal cs...
|
158
|
return $row;
|
1e991822
Mihail
csv parser with e...
|
159
160
161
|
}
|
1e991822
Mihail
csv parser with e...
|
162
163
|
}
|