nataraj: (Default)
[personal profile] nataraj
Есть дамп mysql'ной базы. Задача: вынуть оттуда данные.
Разворачивать этот дамп в базу категорически не хочется... Хотя бы потому что в проекте mysql не используется...
Парсить регулярными выражениями строки в которых заведомо внутри кавычек могут оказаться скобки, запятые и те же кавычки закранированные слэшами -- удовльствия мало.

Предполагаемое решение:

# my $str = "INSERT INTO `libbook` VALUES (1,'Aarh_Andrej_Aida',7162,'2007-06-20 13:24:00','Аида',0,0,'ru','fb2',0,'','','1.0','Mon Jun 10 21:40:30 2013'),(2,'Aarh_Andrej_Arlekino_i_P\\'ero',8066,'2007-06-20 13:24:01','Арлекино и Пьеро',0,0,'ru','fb2',0,'','','1.0','Mon Jun 10 21:40:30 2013');";

open F, 'lib.libbook.sql';
my $str;
while ($str = )
{
last if $str =~ /^INSERT INTO \`libbook\` VALUES \(/;
}

$str =~s/^INSERT INTO \`libbook\` VALUES \(/\=\(\[/; # Все начинается с "=(["
$str =~s/\)\,\(/\]\,\[/g; # Заменяем круглые скобки на квадратные
$str =~s/\)\;/\]\)\;/;

# Двойные кавычки экранировать не надо, ибо они в mysql уже заэкранированны.

$str =~s/(\d)\,\'/$1\,\"/g; # заменяем одинарные кавычки на двойные
$str =~s/\'\,(\d)/\"\,$1/g;
$str =~s/\'\,\'/\"\,\"/g;
$str =~s/\'\]/\"\]/g;

$str =~ s/([A-Za-z])/"\\x".unpack("H*",$1)/ge; # заменяем все латинские буквы на /x последовательности (типа защита от ijection)
$str = '@l'.$str; # добавляем в начало @l в которую все это будет присваиваться...

my @l=();

eval $str;

foreach (@l)
{
print $_->[0]," - ",$_->[1]," - \t", $_->[4],"\n";
}
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 21st, 2026 12:31 pm
Powered by Dreamwidth Studios