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/*.*
Афоризм дня:
Ложь опровергнуть непреложными фактами. (601)
Leave a reply