2015-07-31 2 views
-1

Я пытаюсь удалить временные таблицы из ddl из более чем 100 таблиц, проанализировав файл с помощью python и regex. Мне удалось получить результат, который я хочу использовать '_TMP' in line, но я отчаянно хочу добиться этого с помощью регулярного выражения. У меня возникли проблемы с выяснением того, как разбирать несколько строк, что невозможно, если вы повторяете строку за строкой правильно?Разбор ddl в Python с регулярным выражением с использованием re

Пример DDL:

CREATE TABLE EXNAME.EXTABLE_TMP (
    CONTRIBUTOR_ID VARCHAR2(32) NOT NULL, 
    AFFILIATION_TYPE VARCHAR2(10) NOT NULL, 
    SEQ_NUMBER NUMBER(2) NOT NULL, 
    PRIMARY KEY (CONTRIBUTOR_ID,AFFILIATION_TYPE,SEQ_NUMBER) 
); 

CREATE TABLE EXNAME.EXTABLE (
    CONTRIBUTOR_ID VARCHAR2(32) NOT NULL, 
    AFFILIATION_TYPE VARCHAR2(10) NOT NULL, 
    SEQ_NUMBER NUMBER(2) NOT NULL, 
    PRIMARY KEY (CONTRIBUTOR_ID,AFFILIATION_TYPE,SEQ_NUMBER) 
); 

Мое текущее решение:

f.open('/path/to/file.txt') 
copy.open('/path/to/fileCopy.txt') 

tmpFound = False 

for line in f: 
    if '_TMP' in line: 
     tmpFound = True 
    elif tmpFound == True and ';' in line: 
     tmpFound = False 
     continue 
    if not tmpFound: 
     print(line) 
     copy.write(line) 

f.close() 
copy.close() 
+1

Каков ваш ожидаемый результат? –

+1

Если это одноразовая операция, вы можете использовать SublimeText, которые поддерживают рекурсивный синтаксис regex для удаления таблицы _TMP. Python 're' не соответствует задаче, если вы хотите написать минимальный код. – nhahtdh

ответ

1

Вы можете прочитать в файле DDL в виде строки операторов SQL, а затем использовать sqlparse библиотеку для разбора строки из в список отдельных операторов SQL. Оттуда вы можете перебирать каждую инструкцию SQL в списке и использовать регулярное выражение для определения операторов CREATE TABLE для таблиц с _TMP в имени.

Установка sqlparse пакет через пип

(stackoverflow)[[email protected] stackoverflow]# pip install sqlparse

identify_tmp_tables.py

import sqlparse, re 

def main(): 
    with open ('/path/to/file.txt') as ddl_file: 
     sql = ddl_file.read() 
     ddls = sqlparse.split(sql) 
     tmp_tables_regex = re.compile("^CREATE TABLE.*_TMP.*\(") 
     for ddl in ddls: 
      tmp_table_match = tmp_tables_regex.match(ddl) 
      if tmp_table_match: 
       print "The following DDL is a TMP table:" 
       print sqlparse.format(ddl, reindent=True, keyword_case='upper') 

if __name__ == "__main__": 
    main() 

Выход

(stackoverflow)[[email protected] stackoverflow]# python identify_tmp_tables.py 
The following DDL is a TMP table: 
CREATE TABLE EXNAME.EXTABLE_TMP (CONTRIBUTOR_ID VARCHAR2(32) NOT NULL, AFFILIATION_TYPE VARCHAR2(10) NOT NULL, SEQ_NUMBER NUMBER(2) NOT NULL, PRIMARY KEY (CONTRIBUTOR_ID,AFFILIATION_TYPE,SEQ_NUMBER)); 
+0

Это довольно удивительно. Благодарю jlyoung! У Python есть пакет для всего. – Jonathan

Смежные вопросы