Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Проблема с конвертацией базы mySQL |

16.10.2009, 09:37
|
|
Участник форума
Регистрация: 25.06.2006
Сообщений: 220
Провел на форуме: 2052669
Репутация:
178
|
|
Проблема с конвертацией базы 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: и т.д.
|
|
|

16.10.2009, 10:12
|
|
Постоянный
Регистрация: 07.03.2009
Сообщений: 357
Провел на форуме: 1284900
Репутация:
399
|
|
Ну можно сделать бекап базы а потом просто сделать замену:
s/n: на ' , 's/n:
key: на ' , 'key:
Ну или распарсить всю базу регулярками для надёжности...
|
|
|

16.10.2009, 10:12
|
|
Участник форума
Регистрация: 07.09.2008
Сообщений: 139
Провел на форуме: 351188
Репутация:
65
|
|
если я всё правильно понял, то нужно написать php скрипт с регуляркой, которая будет отделять NAME: ------ и до пробела в старой таблице и писать в новую.
т.к. записей очень много - стоит воспользоваться LIMIT. что-бы в ручную не перезапускать скрипт - можно по завершению очередного цикла обработки отображать браузеру яваскрипт, который передаст в url следующее значение limit
|
|
|

16.10.2009, 10:13
|
|
Постоянный
Регистрация: 07.03.2009
Сообщений: 357
Провел на форуме: 1284900
Репутация:
399
|
|
|
|
|

16.10.2009, 10:15
|
|
Участник форума
Регистрация: 07.09.2008
Сообщений: 139
Провел на форуме: 351188
Репутация:
65
|
|
всё очень сильно зависит от сервера - где всё это лежит. 
|
|
|

16.10.2009, 10:19
|
|
Постоянный
Регистрация: 07.03.2009
Сообщений: 357
Провел на форуме: 1284900
Репутация:
399
|
|
Сообщение от Byte_
всё очень сильно зависит от сервера - где всё это лежит. 
В любом случае подобные операции на "живой" БД делать нельзя, так что так и так придётся это делать на другой машине.
|
|
|

16.10.2009, 10:23
|
|
Участник форума
Регистрация: 07.09.2008
Сообщений: 139
Провел на форуме: 351188
Репутация:
65
|
|
согласен.
Вот регулярку накидал
Name: .*(?=s\/n)
проверял на яваскрипте. работает, но нужно предварительно пробели пропарсить (что-бы 2 пробела в некоторых местах на один заменить)
|
|
|

16.10.2009, 10:38
|
|
Участник форума
Регистрация: 25.06.2006
Сообщений: 220
Провел на форуме: 2052669
Репутация:
178
|
|
Забыл сказать, иногда бывает что имени пользователя нет, а серийник есть, его надо перебросить из name в serial и занулить name, так же иногда встречаются конструкции:
Name: iNTENSiON s/n: 214547403613104583621042757fA2 or Name: shadow_DWRF s/n: 214547403613104583621042757fA2
Их надо разбить на 2 запроса. Я уже хз что придумать.
|
|
|

16.10.2009, 10:57
|
|
Познавший АНТИЧАТ
Регистрация: 01.12.2006
Сообщений: 1,769
Провел на форуме: 3718311
Репутация:
1118
|
|
под вечер скинь в пм файлик с самыми тяжкими случаями (строк 10-20) - распарсим (я какраз недавно распарсивал бэкап мускуля так что есть наработки). мож что и выйдет.
|
|
|

16.10.2009, 11:31
|
|
Участник форума
Регистрация: 07.09.2008
Сообщений: 139
Провел на форуме: 351188
Репутация:
65
|
|
я вы предложил по шагам конструкция " 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;
?>
приблизительно так.
зы: пару не стандартных строк, если не сложно скинь лучше сюда. задачка интересная - я бы тоже подумал.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|