PHP
Найти файлы внутри папки по дате и по списку CSV или Excel на PHP
В нашем кейсе у нас есть таблица с данными клиентов и мы хотим взять из директории только те файлы что соответствуют списку.
Выберем самую релевантную колонку, например серия и номер паспорта.
- сохраняем наш Office Excel формат в CSV и тип файла выбираем обязательно "csv ms-dos" или "csv просто с запятыми".
Пишем скрипт:
= $min_m_time) AND ($filemtime <= $max_m_date)) {
$files[] = $file;
}
}
return ($files) ? $files : false;
}
// -------------- 1 этап - распарсим CSV и получим список сигнатур для поиска файлов ---------------- ////
$data = file($csv_file);
echo "Count strings in csv file - " . count($data) . PHP_EOL;
//Переберем каждую строку и распарсим её на массив
//str_getcsv — Выполняет разбор CSV-строки в массив
foreach ($data as $key => $row) {
if ($key == 0) {
$head = str_getcsv($row, ';');
// $date_create_key = array_search($needle_heads[0], $head);
$passport2_key = array_search($needle_heads[1], $head);
} else {
$client_array = str_getcsv($row, ';');
$client_passport2 = $client_array[$passport2_key];
// $client_date_create = $client_array[$date_create_key];
//$myDateTime = DateTime::createFromFormat('d m y', $client_date_create);
//$newDateString = $myDateTime->format('Y-m-d');
//$name_part = $newDateString.'_'.$client_passport2;
$name_part = $client_passport2;
$needle_parts[] = $name_part;
}
}
if (empty($needle_parts)) {
die('empty needle parts!');
}
echo 'count needle_parts - ' . count($needle_parts) . PHP_EOL;
//dump($needle_parts);die();
// -------------- 2 этап - получим список файлов в директории где будем проводить поиск ---------------- ////
$files = scan_dir($source_dir, strtotime($minTime), strtotime($maxTime));
if (empty($files)) {
die('empty needle $files!');
}
echo "count files - " . count($files) . PHP_EOL;
// -------------- 3 этап - получим список файлов у которых есть совпадение по маске(сигнатуре) ---------------- ////
//$work_piece = 1;
$finded_files = [];
foreach ($needle_parts as $key_part => $needle_part) {
if (empty($needle_part)) {
continue;
}
$double = 0;
foreach ($files as $file_key => $file_name) {
if ((strripos($file_name, $needle_part) === false) OR (strripos($file_name, 'sign'))) {
//Если не найдено вхождение или этот файл - sign-файл
continue;
} else {
$finded_files[] = $file_name;
//unset($files[$file_key]);
}
$double++;
if ($double > 1) {
echo "$double дубликат файла $file_name. По сигнатуре '$needle_part'" . PHP_EOL;
}
}
if (($key_part % $batch_size) == 0) {
echo 'Текущая обработанная часть: ' . $key_part . '. Найдено совпадений: ' . count($finded_files) . PHP_EOL;
}
}
if (empty($finded_files)) {
die('empty $finded_files !');
}
echo 'count finded files: ' . count($finded_files) . PHP_EOL;
// -------------- 4 этап - скопируем все файлы из одной директории в другую ---------------- ////
$count_files_copied = 0;
foreach ($finded_files as $file) {
copy($source_dir . $file, $dest_dir . $file);
$count_files_copied++;
if ($count_files_copied > $max_file_to_copy) {
die('done!');
}
}
Пример запуска скрипта на сервере Linux:
php console.php csv_msd.csv
В результате скрипт выберет все файлы из source_dir по списку csv_msd.csv и поместит в dest_dir
В качестве бонуса заархивируем наши файлы:
zip myarchive.zip -r /home/dest_dir/
Если вдруг что то пошло не по плану, нужно будет очистить папку dest_dir:
rm -Rf /home/dest_dir/*.*
Афоризм дня:
Лучше, чтобы хвалил нас кто?нибудь другой, чем хвалить самого себя. (583)
By den
On November 28, 2019