Обработка файлов CSV и сохранение структуры в базу данных с дальнейшим поиском.
Имеется папка с большим количеством файлов формата CSV, все они одной структуры(столбцы одинаковы)
Файлы CSV являются текстовыми и имеют структуру через разделение символом ;
Сделаем обработку файлов и сохранение в базу данных
В общем виде, открываем файл на чтение, читаем каждую строку, получаем данные столбцов и сохраняем в таблицу:
$DIR = 'data/';
$files = scandir($DIR);
foreach($files as $k => $file)if($file!='.'&&$file!='..'){
$cfile = $DIR.$file;
$pi=pathinfo($cfile);
$open = fopen($cfile, "r"); $strnum=0;
while (($data = fgetcsv($open, 10000, ";")) !== FALSE){
$data = array_map( "convert", $data );
if($strnum>$proc['pos']){
DB_insert($DB,$data,$file);//записываем в таблицу
}
}
fclose($open);
}
function convert( $str ) {//преобразуем кодировку для базу данных
return iconv( "Windows-1251", "UTF-8", $str );
}
Код обходит указанную папку, открывает каждый файл и заносит данные в базу данных. Процесс долгий и его необходимо выполнять в консоли или реализовывать процесс сохранения этапа работы в отдельный файли при новом вызове брать параметры.
function DB_table_polya(){
$polya = array(
'fedokr'=>'Федеральный округ',
'oblast'=>'Область',
'kod'=>'Код',
'tip'=>'Тип',
'marka'=>'Марка',
'model'=>'Модель',
'markaimodel'=>'Марка и модель автомобиля',
'kattrsr'=>'Категория транспортного средства',
'data_pervreg'=>'Дата первичной регистрации',
'data_poslope'=>'Дата последней операции',
'godvyp'=>'Год выпуска',
'vin'=>'VIN',
'num_dvig'=>'Номер двигателя',
'num_kuz'=>'Номер кузова',
'num_shas'=>'Номер шасси',
'kod_tehop'=>'Код технологической операции',
'kat_vlad'=>'Категория владельца',
'moschn_dvig'=>'Мощность двигателя',
'objem_dvig'=>'Объем двигателя',
'tip_dvig'=>'Тип двигателя',
'priz_rasp_rul'=>'Признак расположения руля',
'tip_tr_sr'=>'Тип транспортного средства',
'razr_max_massa'=>'Разрешенная максимальная масса',
'massa_bez_naegr'=>'Масса без нагрузки',
'name_ur_lic'=>'Наименование юр.лица',
'inn_ur_lic'=>'ИНН юр.лица',
'name_rajon_reg'=>'Наименование района регистрации ТС',
'name_naspunkt'=>'Наименование населенного пункта',
'ulica'=>'Улица',
'dom'=>'Дом'
);
return $polya;
}
function DB_insert($DB,$data,$file){
$values = array();
$polya = DB_table_polya();
$kol=0;
$i=0; foreach($polya as $k => $v){
if(isset($data[$i])&&$data[$i]!='') $values[] = '"'.$DB->rescape($data[$i]).'"';
else {
$values[] = '""';
$kol++;
}
$i++;
}
if(count($polya)!=$kol){
$sql = 'INSERT INTO tablevins VALUES(0,"'.$DB->rescape($file).'",'.implode(',',$values).');';
$rez = $DB->QUR($sql);
}
}
Функции для вставки данных в таблицу. DB_table_polya() — функция для получения всех необходимых полей. DB_insert — функция для вставки данных в таблицу.
Перед запуском необходимо создать базу данных и таблицу в которую будем вставлять данные из файлов
Реализация WEB интерфейса для поиска данных
Создадим для пользователя форму, через которую он сможет найти необходимые данные
<form class="row g-3 justify-content-center" method="POST">
<div class="col-md-3">
<label for="vin" class="form-label">VIN</label>
<input type="TEXT" class="form-control" id="vin" name="vin" value="%vin%">
</div>
<div class="col-md-3">
<label for="num_kuz" class="form-label">Номер кузова</label>
<input type="TEXT" class="form-control" id="num_kuz" name="num_kuz" value="%num_kuz%">
</div>
<div class="col-md-3">
<input class="form-check-input" type="checkbox" value="1" id="tipsearch" name="tipsearch">
<label class="form-check-label" for="tipsearch">тип поиска строгое</label>
</div>
<div class="col-2">
<button type="submit" class="btn btn-primary" id="search" name="search">Поиск</button>
</div>
</form>
Поиск происходит по двум полям VIN и номеру кузова. Опция «тип поиска» позволяет объединять искомые по условию «И» или «ИЛИ»
function DB_search($DB,$data){
$out = array();
$usl = array();
foreach($data['where'] as $k => $v){
if($v!=''){
$usl[] = $k.' LIKE "%'.$DB->rescape($v).'%"';
}
}
if(count($usl)){
$tip = ' OR '; if($data['tipsearch']==1) $tip = ' AND ';
$sql = 'SELECT * FROM tablevins WHERE '.implode($tip,$usl);
$rez = $DB->QUR_SEL($sql);
if(!$rez['err']&&$rez['kol']){
$out = $rez['rez'];
}
}
return $out;
}
Функция для поиска в таблице данных, универсальная и получает опции поиска через переменную $data
if(isset($_POST['search'])){
$vin = $_POST['vin'];
$num_kuz = $_POST['num_kuz'];
$data['tipsearch'] = 0; if(isset($_POST['tipsearch'])) $data['tipsearch'] = 1;
$data['where']['vin'] = $vin;
$data['where']['num_kuz'] = $num_kuz;
$rez = DB_search($DB,$data);
$TR=''; $TABLE='';
if(count($rez)){
$tr = file_get_contents('tpl/mod_tr.html');
$polya = DB_table_polya();
foreach($rez as $key => $val){
$tmp = $tr;
foreach($polya as $k => $v){
$tmp = str_replace('%'.$k.'%', $val[$k], $tmp);
}
$TR .= $tmp;
}
$TH = $tr;
foreach($polya as $k => $v){
$TH = str_replace('%'.$k.'%', $v, $TH);
}
$TH = str_replace('td', 'th', $TH);
$TABLE = '';
$TABLE .= '<div class="table-responsive">';
$TABLE .= '<table class="table">';
$TABLE .= '<thead>'.$TH.'</thead>';
$TABLE .= '<tbody>'.$TR.'</tbody>';
$TABLE .= '</table>';
$TABLE .= '</div>';
}
}
Получение POST данных из формы, формирование переменной $data для поиска и отображение результата.
Шаблон HTML строки таблицы хранится в отдельном файле и в нем заменяются вставки %% на полученные данные.
<tr>
<td>%fedokr%</td> <td>%oblast%</td>
<td>%kod%</td> <td>%tip%</td>
<td>%marka%</td> <td>%model%</td>
<td>%markaimodel%</td> <td>%kattrsr%</td>
<td>%data_pervreg%</td> <td>%data_poslope%</td>
<td>%godvyp%</td> <td>%vin%</td>
<td>%num_dvig%</td> <td>%num_kuz%</td>
<td>%num_shas%</td> <td>%kod_tehop%</td>
<td>%kat_vlad%</td> <td>%moschn_dvig%</td>
<td>%objem_dvig%</td> <td>%tip_dvig%</td>
<td>%priz_rasp_rul%</td> <td>%tip_tr_sr%</td>
<td>%razr_max_massa%</td> <td>%massa_bez_naegr%</td>
<td>%name_ur_lic%</td> <td>%inn_ur_lic%</td>
<td>%name_rajon_reg%</td> <td>%name_naspunkt%</td>
<td>%ulica%</td> <td>%dom%</td>
</tr>
Содержимое файла mod_tr.html