Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со строками!!! 
:(
    Опции темы
Aleksandriys
  Дата 13.10.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго..., помогите плиз, мне нужно сделать програму парсинга срок в файле, строки это запросы. Мне надо сделать анализ на тип запроса, тоесть разделить, 4-е типа, по типам запроса, потом каждый тип разделить по использованию общих таблиц, полей, условий выборки, группировки и т.д. И в конце каждого из типов я должен буду получить получить четыре группы запросов с максимально большим количеством общих аргументов. Заранее спасибо.  

Например 

10 Select использующих таблицу T1, одно и тоже поле Р1 из таблицы T1 и т.д
и так все 4-е типа.

Дайте плиз хотя бы наводку бо я совсем пока незнаю как к этому подойти.
PM MAIL   Вверх
LSD
Дата 13.10.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. Берем StringTokenizer, разбиваем им строку на токены и анализируем ее. Т.е. если среди токенов встретился select, значит это выборка и надо искать после токена select имена столбцов, и т.д.
Минус состоит в том, что могут быть проблемы со сложными запросами типа:
Код
UPDATE employees a 
    SET department_id = 
        (SELECT department_id 
            FROM departments 
            WHERE location_id = '2100'), 
        (salary, commission_pct) = 
        (SELECT 1.1*AVG(salary), 1.5*AVG(commission_pct) 
          FROM employees b 
          WHERE a.department_id = b.department_id) 
    WHERE department_id IN 
        (SELECT department_id 
          FROM departments
          WHERE location_id = 2900 
              OR location_id = 2700);


2. Берем готовый парсер SQL, например Zql: a Java SQL parser. Но придется в нем разобраться, и не совсем ясно можно ли в нем варьировать синтаксис входного SQL.

3. Берем генератор парсеров (тот же JavaCC) и создаем свой собственный. Весьма трудоемкая и непростая задача.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
s8e8r8g8e
Дата 13.10.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



наверно всё так, кроме того что счас в джавадоке токенайзера написано(1й вариант) 
HTML
It is
 * recommended that anyone seeking this functionality use the <tt>split</tt>
 * method of <tt>String</tt> or the java.util.regex package instead.

PM MAIL   Вверх
Aleksandriys
Дата 14.10.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот набрасал кусок 
Код
class QueryMetaData { 
   public QueryMetaData(String query) { 
      // Parsing SQL SELECT expression (for example, by regex) ... 
   } 
   public int getColumnCount() { ... } 
   public String getColumnName(int index) { ... } 
   public int getTableCount() { ... } 
   public String getTableName(int index) { ... } 
   public String getTableAlias(int index) { ... } 
   public Collection<String> getTableColumns(int index) { ... } 
   public boolean hasColumn(String tblName, String colName) { ... } 
   public String getWhereClause() { ... } 
} 
String input = "SELECT a.c1, a.c2 , b.c1, b.c2 FROM tableA a, tableB b WHERE a.c1 = b.c2"; 

String emptyRegex = "[\\s]*"; 
String selectRegex = emptyRegex + "SELECT[\\s]+(.+)[\\s]+FROM[\\s]+(.+)[\\s]+(WHERE[\\s]+(.+))?" + emptyRegex; 
Pattern ptrn = Patterm.compile(selectRegex, Pattern.CASE_INSENSITIVE); 

Matcher m = ptrn.matcher(input); 
if (m.matches()) { 
  String columnsClause = m.group(1); // "a.c1, a.c2 , b.c1, b.c2" 
  String fromClause = m.group(2);      // "tableA a, tableB b" 
  String whereClause = m.group(4);    // "a.c1 = b.c2" 
  // Parse fromClause to get table names and aliases... 
  // Parse columnClause to get column definitions... 
  // Parse whereClause... 
} else { 
  System.out.println("Invalid SELECT query"); 
}
 
Но как сделать так чтобы читалась строка из файла, Как группировать запросы с общими аргументами?
PM MAIL   Вверх
LSD
Дата 14.10.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Как читать строки из файла есть пример в соседнем топике.
А чтобы группировать запросы с общими аргументами, эти аргументы надо вначале выделить из запроса.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Aleksandriys
Дата 16.10.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для их выделения применяться так называемый клястерный анализ подскажите какую нибудь ссылочку примера реализации на Яве. Спасибо.

Это сообщение отредактировал(а) Aleksandriys - 16.10.2006, 11:56
PM MAIL   Вверх
LSD
Дата 16.10.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Aleksandriys @  16.10.2006,  11:40 Найти цитируемый пост)
А как их выделять?

Как ты в итоге решил парсить строки, регулярками? И что со сложными запросами (вложенные поздапросы и т.п.)?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Aleksandriys
Дата 16.10.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Небудет у меня вложенных подзапросов, это лишняя головная боль!
PM MAIL   Вверх
Aleksandriys
Дата 17.10.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите плиз как обьединять строки?
PM MAIL   Вверх
LSD
Дата 17.10.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Код
"ABC" + "DEF"



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Aleksandriys
Дата 17.10.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile непонял!!! Можно конкретнее
PM MAIL   Вверх
LSD
Дата 17.10.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Что ты подразумеваешь под:
Цитата(Aleksandriys @  17.10.2006,  15:18 Найти цитируемый пост)
как обьединять строки?



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Aleksandriys
Дата 17.10.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне надо что-то типа.... string = string1.concat(string2).concat(string3)
PM MAIL   Вверх
LSD
Дата 17.10.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Aleksandriys @  17.10.2006,  16:05 Найти цитируемый пост)
Мне надо что-то типа.... string = string1.concat(string2).concat(string3)

Это делается так:
Код
int i = 33;
String units = "Mb";
String str = "i value = " + i + units;

В результате в str будет "i value = 33Mb".

Если надо делать много конкатенаций, то лучше создать StringBuffer и работать с ним:
Код
StringBuffer buffer = new StringBuffer();
buffer.append("i = ").append(i).append(" msec\n");
buffer.append("j = ").append(j).append(" msec\n");
String str = buffer.toString();



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Aleksandriys
Дата 19.10.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, как получить инфу из запроса про условия выборки и сортировки?
для получения информации о таблицах и колонках используеться такой код

Код

public class QueryInfoCollector { 
   public parseQuery(String query) throws QueryParseException { 
      if (query == null || query.length == 0) { 
         throw new QueryParseException("Query string is null or empty"); 
      } 
       
      // Наивно определяем с каким типом запроса имеет дело 
      if (query.toUpperCase().indexOf("SELECT") > -1) { 
         parseSelect(query); 
      } else if (query.toUpperCase().indexOf("UPDATE") > -1) { 
         parseUpdate(query); 
      } else if (query.toUpperCase().indexOf("INSERT") > -1) { 
         parseInsert(query); 
      } else if (query.toUpperCase().indexOf("DELETE") > -1) { 
         parseDelete(query); 
      } else { 
         throw new QueryParseException("Unknown or unsupported SQL query: " + query); 
      } 
   } 
    
   public void parseSelect(String query) throws QueryParseException { 
      Matcher m = SELECT_PATTERN.matcher(query); 

      if (m.matches()) { 
         String columnsClause = m.group(1); // "a.c1, a.c2 , b.c1, b.c2" 
         Map<String, String> cols = parseColumnList(columnsClause); 
         String fromClause = m.group(2);      // "tableA a, tableB b" 
         Map<String, String> tables = parseTableList(fromClause); 

         // Делаем, что надо с полученными таблицами и ячейками... 

      } else { 
         throw new QueryParseException("Invalid SELECT query: " + query); 
      } 
   } 
    
   public void parseUpdate(String query) throws QueryParseException {...} 

   public void parseDelete(String query) throws QueryParseException {...} 

   public void parseInsert(String query) throws QueryParseException {...} 

   public void reset() { 
      // Очищаем статистику... 
   } 
    
   /** Parses tables list (tables delimited by comma) and returns the Map of pairs (<table name>, <table alias>) */ 
   private Map<String, String> parseTableList(String str) { 
      Map<String, String> result = new HashMap<String, String>(); 
      StringTokenizer tokenizer = new StringTokenizer(str, ","); 
      while (tokenizer.hasMoreTokens()) { 
         String token = tokenizer.nextToken().trim(); 
         Matcher m = TABLE_PATTERN.matcher(token); 
         if (m.matches()) { 
            String tblName = m.group(1); 
            String tblAlias = m.group(4); 
            result.put(tblName, tblAlias); 
         } else { 
            throw new QueryParseException("Invalid table token in FROM clause: " + str); 
         } 
      } 
      return result; 
   } 

   /** Parses columns list (columns delimited by comma) and returns the Map of pairs (<table name or alias>, <column name>) */ 
   private Map<String, String> parseColumnList(String str) { 
      Map<String, String> result = new HashMap<String, String>(); 
      StringTokenizer tokenizer = new StringTokenizer(str, ","); 
      while (tokenizer.hasMoreTokens()) { 
         String token = tokenizer.nextToken().trim(); 
         Matcher m = COLUMN_PATTERN.matcher(token); 
         if (m.matches()) { 
            String table = m.group(1); 
            String column = m.group(2); 
            result.put(table, column); 
         } else { 
            throw new QueryParseException("Invalid table token in FROM clause: " + str); 
         } 
      } 
      return result; 
   } 
    
   //... 
    
   private static final String EMPTY_REGEX = "[\\s]*"; 
   private static final String SPACE_REGEX = "[\\s]+"; 
   private static final String WHERE_CLAUSE_REGEX = "(WHERE" + SPACE_REGEX + "(.+) )?"; 

   private static final String SELECT_REGEX = EMPTY_REGEX + 
            "SELECT" + SPACE_REGEX + "(.+)" + SPACE_REGEX + 
            "FROM" + SPACE_REGEX + "(.+)" + SPACE_REGEX + 
            WHERE_CLAUSE_REGEX + SPACE_REGEX + 
            "ORDER BY" + SPACE_REGEX + "(.+)" + EMPTY_REGEX; 

   private static final String UPDATE_REGEX = EMPTY_REGEX + 
            "UPDATE" + SPACE_REGEX + "(.+)" + SPACE_REGEX + 
            "SET" + SPACE_REGEX + "(.+)" + SPACE_REGEX + 
            WHERE_CLAUSE_REGEX + EMPTY_REGEX; 

   private static final String INSERT_REGEX = EMPTY_REGEX + 
            "INSERT" + SPACE_REGEX + "INTO" + SPACE_REGEX + "(.+)" + SPACE_REGEX + "(\\(" + SPACE_REGEX + "(.+)" + SPACE_REGEX + "\\))?" 
            "VALUES" + SPACE_REGEX + "\\(" + SPACE_REGEX + "(.+)" + SPACE_REGEX + "\\)" + EMPTY_REGEX; 

   private static final String DELETE_REGEX = EMPTY_REGEX + 
            "DELETE" + SPACE_REGEX + "FROM" + SPACE_REGEX + "(.+)" + SPACE_REGEX + 
            WHERE_CLAUSE_REGEX + EMPTY_REGEX; 
    
   private static final String IDENTIFIER_REGEX = "([\\w]*)"; 
   private static final String COLUMN_REGEX = IDENTIFIER_REGEX + "[\\.]" + IDENTIFIER_REGEX; 
   private static final String TABLE_REGEX = IDENTIFIER_REGEX + "(" + SPACE_REGEX + "(AS" + SPACE_REGEX + ")?" + IDENTIFIER_REGEX + ")?"; 

    
   private static final Pattern SELECT_PATTERN = Pattern.compile(SELECT_REGEX, Pattern.CASE_INSENSITIVE); 
   private static final Pattern UPDATE_PATTERN = Pattern.compile(UPDATE_REGEX, Pattern.CASE_INSENSITIVE); 
   private static final Pattern INSERT_PATTERN = Pattern.compile(INSERT_REGEX, Pattern.CASE_INSENSITIVE); 
   private static final Pattern DELETE_PATTERN = Pattern.compile(DELETE_REGEX, Pattern.CASE_INSENSITIVE); 
   private static final Pattern COLUMN_PATTERN = Pattern.compile(COLUMN_REGEX, Pattern.CASE_INSENSITIVE); 
   private static final Pattern TABLE_PATTERN = Pattern.compile(TABLE_REGEX, Pattern.CASE_INSENSITIVE);




Это сообщение отредактировал(а) Aleksandriys - 23.10.2006, 17:13
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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