Как разделить строку на несколько частей и поместить в несколько полей таблицы MySQL?

В настоящее время я получаю список каталогов с нескольких разных жестких дисков и сохраняю каждый из них в виде текстового файла. Затем я объединяю эти файлы в один текстовый файл большего размера, а затем импортирую текстовый файл в таблицу MySQL, чтобы я мог извлечь каждый компонент из строки (каждую строку текстового файла) в соответствующие поля моей таблицы. Каждая строка форматируется следующим образом:

Диск:\имя_папки\имя_файла.EXT размер_файла

пример:

C:\example\example.txt 123456

Я уже давно успешно делаю это в MS Access. Единственная проблема в Access, каждая команда должна быть по одной.

Я хочу использовать файл PHP, чтобы сделать весь длительный процесс более автоматизированным и менее подверженным ошибкам. Я новичок в программировании на PHP и во многом полагался на этот замечательный сайт в своем прогрессе, которого я достиг до сих пор.

Команды SQL, которые я использую в MS Access:

UPDATE DirList_FORMATED SET fileSizeRAW = Mid([pathRAW], InStrRev([pathRAW]," ")+1);

UPDATE DirList_FORMATED SET path = REPLACE(pathRAW, fileSizeRAW, '');

UPDATE DirList_FORMATED SET path = Trim(path);

UPDATE DirList_FORMATED SET fileExt = Mid([path], InStrRev([path],".")+1);

UPDATE DirList_FORMATED SET drive = Left(path, 1);

UPDATE DirList_FORMATED SET path = REPLACE(path, 'M:\', '') WHERE Left(path, 1) = 'M';

UPDATE DirList_FORMATED SET path = REPLACE(path, 'N:\', '') WHERE Left(path, 1) = 'N';

UPDATE DirList_FORMATED SET path = REPLACE(path, 'O:\', '') WHERE Left(path, 1) = 'O';

UPDATE DirList_FORMATED SET path = REPLACE(path, 'P:\', '') WHERE Left(path, 1) = 'P';

UPDATE DirList_FORMATED SET path = Left([path], InStrRev([path],".")-1);

UPDATE DirList_FORMATED SET folderName = Left([path], InStr([path],"\")-1);

UPDATE DirList_FORMATED SET fileName = Mid([path], InStrRev([path],"\")+1);

UPDATE DirList_FORMATED SET flag = 'y'
Where fileExt = 'srt'
or fileExt = 'db'

Delete from DirList_FORMATED
where flag = 'y';

UPDATE DirList_FORMATED SET fileSizeGB = (((fileSizeRAW /1024)/1024)/1024);

UPDATE DirList_FORMATED SET fileSizeGB = ROUND(fileSizeGB, 3);

  1. Импортируйте текстовый файл в таблицу с именем DirList_RAW (используя phpMyAdmin).

используя PHP-код, я успешно:

  1. Я могу подключиться к своей БД
  2. Очистите временную таблицу, которую я использую для форматирования строки под названием DirList_FORMATTED.
  3. Вставьте поле pathRAW из DirList_RAW в поле pathRAW в DirList_FORMATED.

Следующим шагом является получение компонентов строки pathRAW и сохранение их в соответствующем поле, но пока мне это не удалось. Мне нужно извлечь размер файла, имя файла, расширение (расширение файла), имя папки и диск (букву диска) из каждой строки и поместить их в соответствующие поля таблицы.

Любая помощь, которая поможет мне начать или указать правильное направление, будет очень признательна :)

мой php-код на данный момент:

<?php 

// Include the database config file 
include_once 'assets/includes/dbConfig.php'; 

$query = "DELETE FROM DirList_FORMATED";
$conn->query($query);
echo 'DirList_FORMATED emptied <br/>';

$query = "INSERT INTO DirList_FORMATED (pathRAW) SELECT pathRAW FROM DirList_RAW WHERE pathRAW is not null";
$conn->query($query);
echo 'DirList_RAW inserted <br/>';

$query = "UPDATE DirList_FORMATED SET fileSizeRAW = Mid(['pathRAW'], InStrRev(['pathRAW'], ' ' )+1);";
$conn->query($query);
echo 'fileSizeRAW created <br/>';

?>

последняя строка продолжает выдавать ошибку синтаксиса

Я попробовал несколько вариантов цитат, но все равно ничего не понравилось :(

🤔 А знаете ли вы, что...
PHP имеет встроенную поддержку сессий для отслеживания состояния пользователей на веб-сайтах.


71
1

Ответ:

Решено

Образец.

Файл для загрузки:

C:\example\example.txt 123456
D:\example2\example2.txt 123456789
E:\example3.data\example3.txt.txt 123456789012
F:\example3.txt 123

Структура таблицы:

CREATE TABLE test (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  drive CHAR(1),
  path TEXT,
  filename TEXT,
  fileext TEXT,
  filesize BIGINT UNSIGNED,
  raw TEXT
  );

Запрос:

INSERT INTO test(drive, path, filename, fileext, filesize, raw)
SELECT LEFT(raw, 1),
       REGEXP_REPLACE(raw, '^..(.*\\\\)[^\\\\]+$', '$1'),
       REGEXP_REPLACE(raw, '^.+\\\\([^\\\\]+)\\.[^.]* \\d+$', '$1'),
       SUBSTRING_INDEX(SUBSTRING_INDEX(raw, '.', -1), ' ', 1),
       SUBSTRING_INDEX(raw, ' ', -1),
       raw
FROM JSON_TABLE(CONCAT('["', REPLACE(REPLACE(CAST(LOAD_FILE('C:/ProgramData/MySQL/MySQL Server 8.4/Uploads/test.csv') AS CHAR), '\\', '\\\\'), '\r\n', '","'), '"]'),
                '$[*]' COLUMNS (raw TEXT PATH '$')) jsontable;

Результат:

mysql> SELECT * FROM test;
+----+-------+-----------------+--------------+---------+--------------+------------------------------------------------+
| id | drive | path            | filename     | fileext | filesize     | raw                                            |
+----+-------+-----------------+--------------+---------+--------------+------------------------------------------------+
|  1 | C     | \example\       | example      | txt     |       123456 | C:\example\example.txt 123456                  |
|  2 | D     | \example2\      | example2     | txt     |    123456789 | D:\example2\example2.txt 123456789             |
|  3 | E     | \example3.data\ | example3.txt | txt     | 123456789012 | E:\example3.data\example3.txt.txt 123456789012 |
|  4 | F     | \               | example3     | txt     |          123 | F:\example3.txt 123                            |
+----+-------+-----------------+--------------+---------+--------------+------------------------------------------------+