Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Проблема с конвертацией базы mySQL (https://forum.antichat.xyz/showthread.php?t=148690)

GrAmOzEkA 16.10.2009 09:37

Проблема с конвертацией базы mySQL
 
Народ помогите решить одну проблему. Есть база mySQL с серийниками к программам около 120 000. Структура базы такая:
Код:

__ ____ ______ _______
|  |    |      |      |
|ID|soft|serial|comment|
|__|____|______|_______|

В столбце soft находится информация о названии программы. В serial логины,серийники,ключи и т.д.
Прблема состоит в том что я хочу разделить информацию о имени пользователя и серийнике:
Код:

__ ____ ______ _______ _______
|  |    |      |      |      |
|ID|soft| name |serial |comment|
|__|____|______|_______|_______|

Столбец name имя пользователя, serial серийник.

Например было:
Код:

INSERT INTO `base_serials` VALUES (0,'AfterCam 2.4', 'Name: LAXiTY s/n: slajwfcdmxypwdwzahwhw', 'NULL', 'NULL');
INSERT INTO `base_serials` VALUES (0,'Address Everywhere 2.81', 'Name: archigamedis Password: DiSTiNCT s/n: 2104005254', 'NULL', 'NULL');
INSERT INTO `base_serials` VALUES (0,'AcqURL 5.3', 's/n: 893668581437812682205368 ', 'NULL', 'NULL');
INSERT INTO `base_serials` VALUES (0,'All-Purpose Legal Documents 1.01', 'Name: TEAM EViDENCE Company: TEAM EViDENCE s/n: 697-3033-061', 'NULL', 'NULL');
INSERT INTO `base_serials` VALUES (0,'Advanced Popup Killer 2002 2.1', 'Name: iNTENSiON s/n: 214547403613104583621042757fA2 or Name: shadow_DWRF s/n: 214547403613104583621042757fA2', 'NULL', 'NULL');

А надо:
Код:

INSERT INTO `base_serials` VALUES (0,'AfterCam 2.4', 'Name: LAXiTY', 's/n: slajwfcdmxypwdwzahwhw', 'NULL');
INSERT INTO `base_serials` VALUES (0,'Address Everywhere 2.81', 'Name: archigamedis', 'Password: DiSTiNCT s/n: 2104005254', 'NULL');
INSERT INTO `base_serials` VALUES (0,'AcqURL 5.3', 'NULL', 's/n: 893668581437812682205368', 'NULL');
INSERT INTO `base_serials` VALUES (0,'All-Purpose Legal Documents 1.01', 'Name: TEAM EViDENCE Company: TEAM EViDENCE', 's/n: 697-3033-061', 'NULL');
INSERT INTO `base_serials` VALUES (0,'Advanced Popup Killer 2002 2.1', 'Name: iNTENSiON', 's/n: 214547403613104583621042757fA2', 'NULL');
INSERT INTO `base_serials` VALUES (0,'Advanced Popup Killer 2002 2.1', 'Name: shadow_DWRF', 's/n: 214547403613104583621042757fA2', 'NULL');

Примерно так, иногда там где s/n: стоит key: или password: и т.д.

Gray_Wolf 16.10.2009 10:12

Ну можно сделать бекап базы а потом просто сделать замену:
s/n: на ' , 's/n:
key: на ' , 'key:
Ну или распарсить всю базу регулярками для надёжности...

Byte_ 16.10.2009 10:12

если я всё правильно понял, то нужно написать php скрипт с регуляркой, которая будет отделять NAME: ------ и до пробела в старой таблице и писать в новую.
т.к. записей очень много - стоит воспользоваться LIMIT. что-бы в ручную не перезапускать скрипт - можно по завершению очередного цикла обработки отображать браузеру яваскрипт, который передаст в url следующее значение limit

Gray_Wolf 16.10.2009 10:13

Цитата:

120 000
Много? о_О

Byte_ 16.10.2009 10:15

всё очень сильно зависит от сервера - где всё это лежит. ;)

Gray_Wolf 16.10.2009 10:19

Цитата:

Сообщение от Byte_
всё очень сильно зависит от сервера - где всё это лежит. ;)

В любом случае подобные операции на "живой" БД делать нельзя, так что так и так придётся это делать на другой машине.

Byte_ 16.10.2009 10:23

согласен.
Вот регулярку накидал
Name: .*(?=s\/n)
проверял на яваскрипте. работает, но нужно предварительно пробели пропарсить (что-бы 2 пробела в некоторых местах на один заменить)

GrAmOzEkA 16.10.2009 10:38

Забыл сказать, иногда бывает что имени пользователя нет, а серийник есть, его надо перебросить из name в serial и занулить name, так же иногда встречаются конструкции:
Цитата:

Name: iNTENSiON s/n: 214547403613104583621042757fA2 or Name: shadow_DWRF s/n: 214547403613104583621042757fA2
Их надо разбить на 2 запроса. Я уже хз что придумать.

POS_troi 16.10.2009 10:57

под вечер скинь в пм файлик с самыми тяжкими случаями (строк 10-20) - распарсим (я какраз недавно распарсивал бэкап мускуля так что есть наработки). мож что и выйдет.

Byte_ 16.10.2009 11:31

я вы предложил по шагам конструкция " or " - explode
у тебя ведь дамп, так? делаем примерно:
PHP код:

<?
$file 
file_get_contents('dump.sql');
$file explode("\r\n",$file);
$i 0;
foreach(
$file as $f)//парсим конструкцию or
{
if(!(
strpos($f,' or ')===false))
{
$f explode(' or ',$f);
$file[] = $f['0'];$file[] = $f['1']; //тут ещё нужно приписать гачало и конец запросов
$file[$i] = '';
}
$i++;
}
foreach(
$file as $f)if($f != '')$res .= "\r\n".$f;
?>

приблизительно так.

зы: пару не стандартных строк, если не сложно скинь лучше сюда. задачка интересная - я бы тоже подумал.


Время: 18:11