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/*.*
PHP

Leave a reply