Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг SQL 
:(
    Опции темы
Alex089
Дата 17.4.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Добрый день!
Есть скрипт создания базы данных MS SQL Server. Нужно вытащить из него и поместить в другой файл все операторы CREATE TABLE и CREATE TRIGGER (если эти операторы находятся внутри комментариев и/или строк, их извлекать не нужно) так, чтобы один оператор занимал одну строку. Подскажите, пожалуйста, на сколько сложно это реализовать на Perl и как примерно это можно сделать?

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  instpubs.sql 125,51 Kb
PM   Вверх
arto
Дата 17.4.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -lne 'print if (m#^CREATE (?:TABLE|TRIGGER)# .. m#^GO#)'  ?
PM MAIL ICQ   Вверх
Alex089
Дата 17.4.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Так не получится. Если GO встретится в криэйте или триггере как часть строки или комментария, то будет обработан, как окончание тела оператора, а sql-интерпритатор ищет GO вне строк и комметариев. Да и сами CREATE TABLE и CREATE TRIGGER могут быть внутри строк и комментариев  smile 
PM   Вверх
arto
Дата 17.4.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



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

дайте сразу текст с условиями.

пс. пока ваш текст обрабатывает.

Это сообщение отредактировал(а) arto - 17.4.2010, 12:50
PM MAIL ICQ   Вверх
Alex089
Дата 17.4.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Прошу меня простить. Вот такой скрипт
ps Как вы запускали этот парсер? У меня пишет 
Код
"TRIGGER)#" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  creation.sql 2,00 Kb
PM   Вверх
arto
Дата 17.4.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -0777 -nle 'while (m#^\s*(CREATE\s+(?:TABLE|TRIGGER).+?)^\s*GO#gsmi) { print $1 }'

из командной строки

пс. если надо очень хитрое, то perldoc SQL::Translate, либо напрямую Parse::RecDescent.
PM MAIL ICQ   Вверх
Alex089
Дата 19.4.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Нашел такой исходник:
Код
$string =~
 s{
   /\*         ##  Start of /* ... */ comment
   [^*]*\*+    ##  Non-* followed by 1-or-more *'s
   (
     [^/*][^*]*\*+
   )*          ##  0-or-more things which don't start with /
               ##    but do end with '*'
   /           ##  End of /* ... */ comment

 |           ## OR single string comments

   //
   (
     [^\\]
     |
     [^\n][\n]?
   )*?\n

 |         ##     OR  various things which aren't comments:

   (
     "           ##  Start of " ... " string
     (
       \\.           ##  Escaped char
     |               ##    OR
       [^"\\]        ##  Non "\
     )*
     "           ##  End of " ... " string

   |         ##     OR

     '           ##  Start of ' ... ' string
     (
       \\.           ##  Escaped char
     |               ##    OR
       [^'\\]        ##  Non '\
     )*
     '           ##  End of ' ... ' string

   |         ##     OR

     .           ##  Anything other char
     [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
   )
 }{defined $3 ? $3 : ""}gxse;

Он убирает из строки комментарии в стиле C/C++, при этом правильно обходит строковые литералы. Можно сделать, чтобы он убирал еще и однострочные комментарии SQL? Или сделать поиск CREATE TABLE ... GO вне строк и комментариев?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1833 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.