За последние 24 часа нас посетили 59087 программистов и 3023 робота. Сейчас ищут 1659 программистов ...

Разбиение столбца на несколько

Тема в разделе "Прочие вопросы по PHP", создана пользователем Azamat, 29 май 2019.

Метки:
  1. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    Добрый день,

    Задача: разбить столбец таблицы MYSQL на несколько столбцов (date, key, V) по содержимому.

    Исходные данные:
    ------------------------------------------------------------------------------------------
    date29052019;5232.5189;N;06245.9387;E;0;306;A00012345;V123
    ------------------------------------------------------------------------------------------

    Необходимый результат:
    -------------------------------------------------------------------------------------------
    ! date ! map ! key ! V !
    !-------------------!---------------------------------------------!---------------!--------!
    ! 29052019 !5232.5189;N;06245.9387;E;0;306!A00012345!V123!
    !-------------------!---------------------------------------------!---------------!--------!

    Думаю двигаться в направлении:
    1. Исходя из данных strlen (он может быть разный) определить размер массива;
    2. Дальше не знаю).
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    PHP:
    1. <?php
    2.  
    3. $str = 'date29052019;5232.5189;N;06245.9387;E;0;306;A00012345;V123';
    4. preg_match('/(?<=date)([\d]+);(.+);((?=A).+);(V.+)/', $str, $matches);
    5. var_dump($matches);
    --- Добавлено ---
    В песочнице
     
    Azamat нравится это.
  3. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    Благодарю!
     
  4. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    Возник дополнительный вопрос:
    1. Переменная $str не принимает данные из базы данных
    $str = $dbc->query('SELECT str FROM table');
    2. как результат (preg_match) массива сохранить в БД?
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    PHP:
    1. var_dump($str); // что выводит?
    В любом случае, результат запроса нужно в цикле обрабатывать. Типа так:
    PHP:
    1. <?php
    2. while($dbc->query('SELECT str FROM table') as $item) {
    3.     if(preg_match('/(?<=date)([\d]+);(.+);((?=A).+);(V.+)/', $str, $matches)) {
    4.         // Тут запрос на добавлени или обновление в БД
    5.     }
    6. }
    В чем конкретно проблема?
    Вы вообще PDO используете?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    В самом MySQL есть функция substring_index() которой ты можешь вытащить подстроки прямо в запросе - без участия php.
    Код (SQL):
    1. INSERT INTO `newtable`(`date`, `map`, `key`, `v`)
    2. SELECT
    3.   SUBSTRING_INDEX(`x`, ';', 1),
    4.   SUBSTRING_INDEX(`x`, ';', 2), -- с map на самом деле немного хитрее, но суть  надеюсь понятна
    5.   SUBSTRING_INDEX(`x`, ';', 3),
    6.   SUBSTRING_INDEX(`x`, ';', 4),
    7. FROM `oldtable`
    на всякий: склеивать строки в MySQL можно функциями CONCAT() и CONCAT_WS()
    https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
     
  7. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    На самом деле, там всё немного хитрее ;)
    Первую и последнюю подстроку получить достаточно просто (* для последней - SUBSTRING_INDEX(`x`,';',-1)), с подстрокой `key` как бы тоже не очень сложно SUBSTRING_INDEX(SUBSTRING_INDEX(`x`, ';', -2), ';', 1). Ну, а для `map` варианты есть разные, но не все могут быть надёжные. В принципе, как вариант:
    Код (SQL):
    1. SELECT
    2.   REPLACE(SUBSTRING_INDEX(`x`, ';', 1), 'date', ''),
    3.   SUBSTRING(`x`, LOCATE(';', `x`)+1, LENGTH(`x`) - (LOCATE(';', `x`)+1) - LENGTH(SUBSTRING_INDEX(`x`, ';', -2))),
    4.   SUBSTRING_INDEX(SUBSTRING_INDEX(`x`, ';', -2), ';', 1),
    5.   SUBSTRING_INDEX(`x`, ';', -1)
    6. FROM `my_table`
     
  8. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    Ответ интерпретатора PHP:
    Warning: preg_match() expects parameter 2 to be string

    т.е. переменная $str должна быть строкой

    использую PDO:
    try {
    $dbc = new PDO($db_source,$db_user,$db_pass);
    } catch (PDOException $e) {
    echo 'Can not connect to DB: ' . $e->getMessage();
    }
     
  9. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    PHP:
    1. <?php
    2. $arr = [];
    3. while($dbc->query('SELECT str FROM table') as $item) {
    4.     $arr[] = $item;
    5. }
    6. print_r($arr);
    покажите что в массиве $arr
     
  10. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    вместо while foreach:

    Array ( [0] => Array ( [log] => #D#300519;045518;5323.3395;N;06255.0152;E;0;14; 200;16;0.61;NA;NA;;A000000196C8;Type:3:TR,Idx:1:6284,FSD:3:300519,FST:3:045012,FCD:3:300519,FCT:3:045518,A:1:0,Vtag:1:000,Vrdr:1:000,Pump:1:1,Limit:1: 0,FV:2:00588.00,FP:1:000000000,TOT:1:0005984574,FL0:1:0,FV0:1:0,FT0:1:0,FD0:1:0,FL1:1:0,FV1:1:0,FT1:1:0,FD1:1:0,VID:1:0000,ODO:1:00000000 [0] => #D#300519;045518;5323.3395;N;06255.0152;E;0;14; 200;16;0.61;NA;NA;;A000000196C8;Type:3:TR,Idx:1:6284,FSD:3:300519,FST:3:045012,FCD:3:300519,FCT:3:045518,A:1:0,Vtag:1:000,Vrdr:1:000,Pump:1:1,Limit:1: 0,FV:2:00588.00,FP:1:000000000,TOT:1:0005984574,FL0:1:0,FV0:1:0,FT0:1:0,FD0:1:0,FL1:1:0,FV1:1:0,FT1:1:0,FD1:1:0,VID:1:0000,ODO:1:00000000 ) [1] => Array ( [log] => #D#300519;045518;5323.3395;N;06255.0152;E;0;14; 200;16;0.61;NA;NA;;A000000196C8;Type:3:TR,Idx:1:6284,FSD:3:300519,FST:3:045012,FCD:3:300519,FCT:3:045518,A:1:0,Vtag:1:000,Vrdr:1:000,Pump:1:1,Limit:1: 0,FV:2:00588.00,FP:1:000000000,TOT:1:0005984574,FL0:1:0,FV0:1:0,FT0:1:0,FD0:1:0,FL1:1:0,FV1:1:0,FT1:1:0,FD1:1:0,VID:1:0000,ODO:1:00000000 [0] => #D#300519;045518;5323.3395;N;06255.0152;E;0;14; 200;16;0.61;NA;NA;;A000000196C8;Type:3:TR,Idx:1:6284,FSD:3:300519,FST:3:045012,FCD:3:300519,FCT:3:045518,A:1:0,Vtag:1:000,Vrdr:1:000,Pump:1:1,Limit:1: 0,FV:2:00588.00,FP:1:000000000,TOT:1:0005984574,FL0:1:0,FV0:1:0,FT0:1:0,FD0:1:0,FL1:1:0,FV1:1:0,FT1:1:0,FD1:1:0,VID:1:0000,ODO:1:00000000 ) )
     
  11. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    PHP:
    1. <?php
    2. while($dbc->query('SELECT str FROM table') as $item) {
    3.     if(preg_match('/(?<=date)([\d]+);(.+);((?=A).+);(V.+)/', $item['log'], $matches)) {
    4.         // Тут запрос на добавлени или обновление в БД
    5.     }
    6. }
    --- Добавлено ---
    кстати регулярка работать не будет, вы вытягиваете не то что описали.
     
  12. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    Да. Понял. Изначально сократил задачу. Мне необходимо было понять в каком направлении двигаться.
     
  13. Azamat

    Azamat Активный пользователь

    С нами с:
    29 май 2019
    Сообщения:
    7
    Симпатии:
    0
    при работе с большими объемами данных пришлось увеличить max_execution_time. теперь нужно понять как экономить ресурсы при разработке web приложений.