Перейти к содержимому

Поиск в файлах CSV

Обработка файлов CSV и сохранение структуры в базу данных с дальнейшим поиском.

Имеется папка с большим количеством файлов формата 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 — функция для вставки данных в таблицу.

Структура таблицы после обработки файлов CSV

Перед запуском необходимо создать базу данных и таблицу в которую будем вставлять данные из файлов

Реализация 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.