PHP:работа с текстовыми файлами — PHP шаг за шагом

icon128-2x-150x150-3993561Сегодня работаю с файлами — PHP codes. В рамках решения одного проекта возникла необходимость читать все файлы из директорий. Обрабатывать по определенным критериям и записывать в базу данных. Структура папок выглядит следующим образом:

# code … —dir[input]— —dir[PHP-tutorials-Accessing-Databases-Object-Oriented-PHP] —dir[00. Introduction] —>01. Welcome.srt —>02. What you should know before watching this course.srt —>03. Using the exercise files.srt —>04. Setting SQLite permissions.srt —>05. A quick primer on using PHP objects.srt —dir[01. Why Use Object-Oriented PHP to Access a Database] —>01. Overview of PHP database APIs.srt —>02. Using prepared statements.srt —>03. Using transactions.srt

# code …

—dir[input]—

     —dir[PHP-tutorials-Accessing-Databases-Object-Oriented-PHP]

          —dir[00. Introduction]

             —>01. Welcome.srt

             —>02. What you should know before watching this course.srt

             —>03. Using the exercise files.srt

             —>04. Setting SQLite permissions.srt

             —>05. A quick primer on using PHP objects.srt

           —dir[01. Why Use Object-Oriented PHP to Access a Database]

             —>01. Overview of PHP database APIs.srt

             —>02. Using prepared statements.srt

             —>03. Using transactions.srt

То есть: Название курса -> Название темы -> Вложенные файлы. Нужно каждый файл взять для обработки, извлечь из него нужную информацию $timecode и $subtitles, а так же «запомнить» Название курса -> Название темы.

Реализовано в виде двух функций:

  1. scandir_through($dir) в качестве аргумента передаю имя корневой директории [input]. Функция сканирует директории, оставляя только файлы и складывает их в массив, для передачи следующей функции.
  2. recDB($file) принимает массив и оставляя только две строки $timecode и $subtitles записывает в базу данных

# code … // вывод в массив полных путей директорий и файлов // http://php.net/manual/ru/function.glob.php#97899 function scandir_through($dir) { $items = glob($dir . ‘/*’); for ($i = 0; $i < count($items); $i++) { if (is_dir($items[$i])) { $add = glob($items[$i] . ‘/*’); $items = array_merge($items, $add); } } // удаляю элементы не содержащие .srt // https://php.ru/forum/threads/udalenie-ehlementa-massiva-so-sdvigom-ostalnyx.14248/ foreach ($items as $key => $value) { if(preg_match(‘/.srt/’, $items[$key], $match) == 0){ unset($items[$key]); // array_shift($items); } } sort($items); return $items; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# code …

// вывод в массив полных путей директорий и файлов

// http://php.net/manual/ru/function.glob.php#97899

function scandir_through($dir)

{

    $items = glob($dir . ‘/*’);

    for ($i = 0; $i < count($items); $i++) {

        if (is_dir($items[$i])) {

            $add = glob($items[$i] . ‘/*’);

            $items = array_merge($items, $add);

        }

    }

// удаляю элементы не содержащие .srt

// https://php.ru/forum/threads/udalenie-ehlementa-massiva-so-sdvigom-ostalnyx.14248/

    foreach ($items as $key => $value) {

      if(preg_match(‘/.srt/’, $items[$key], $match) == 0){

        unset($items[$key]);

        // array_shift($items);

      }

    }

    sort($items);

    return $items;

}

# code … // функция извлекает удаляет пустые строки и пишет в базу $timecode, $subtitle и $file — путь function recDB($file) { $text = file($file); foreach ($text as $value) { if(strlen($value) >= 6){ // пропускаем пустые строки и номера $needle = ‘—>’; $pos = strripos($value, $needle); switch ($pos) { case ’13’: echo $timecode = $value; // пишем в базу: поле timecode break; default: echo $subtitle = $value; // пишем в базу: поле subtitle break; } } } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# code …

// функция извлекает удаляет пустые строки и пишет в базу $timecode, $subtitle и $file — путь

function recDB($file)

{

  $text = file($file);

  foreach ($text as $value) {

    if(strlen($value) >= 6){ // пропускаем пустые строки и номера

      $needle = ‘—>’;

      $pos = strripos($value, $needle);

      switch ($pos) {

        case ’13’:

          echo $timecode = $value; // пишем в базу: поле timecode

          break;

        default:

        echo $subtitle = $value; // пишем в базу: поле subtitle

          break;

      }

    }

  }

}

Полезные ссылки в самом коде в качестве комментариев. Во второй функции еще нужно дописать вывод в БД)

github-bb449e0ffbacbcb7f9c703db85b1cf0b-300x111-7168935