Заменить определенные управляющие / непечатаемые символы из строки - PullRequest
0 голосов
/ 19 мая 2019

Я пишу скрипт, который читает файлы sql и использует cx_Oracle для выполнения файлов. Некоторые файлы пишутся с использованием только пробелов между каждым оператором SQL и ключевым словом, а другие используют новые строки и табуляции для пробелов. Я сталкиваюсь с проблемой с последним. Например, этот раздел возвращает следующее:

NON_PRINTABLE = """\r\n\t"""
def parseSQLFile(filename):
    with open(filename, 'r') as sqlFile:
        allSQL = sqlFile.read()
        #filteredSQL = filter(lambda ln: ln in string.printable, allSQL)
        # replace specific control characters with spaces to prevent sql compiler errors
        for char in NON_PRINTABLE:
            allSQL.replace(char,' ')


    return allSQL

Я пытался использовать функцию фильтра, переводить и заменять; Тем не менее, я по-прежнему получаю следующие различные результаты из следующего ввода:

Введите:

'select \ n \ ts.id \ n \ t, s.src_cnt \ n \ t, s.out_file \ t \ nfrom \ n \ tkpi_index_ros.composites s \ n \ t, kpi_index_ros.kpi_index_rosoards d \ nwhere \ n \ t1 = 1 \ n \ tand s.kpi_index_rosoard_id (+) = d.id \ n \ tand d.active = 1 \ n; '

Выход 1:

'select \ n s.id \ n, s.src_cnt \ n, s.out_file \ nfrom \ n kpi_index_ros.composites s \ n, kpi_index_ros.kpi_index_rosoards d \ nwhere \ n 1 = 1 \ n и s.kpi_index_rosoard_id (+) = d.id \ n и d.active = 1 \ n; '

Выход 2:

'select \ ts.id \ t, s.src_cnt \ t, s.out_file \ t из \ tkpi_index_ros.composites s \ t, kpi_index_ros.kpi_index_rosoards d, где \ t1 = 1 \ tand s.kpi_index_rosoard_id (+) = d.id \ tand d.active = 1; '

Похоже, он либо заменит вкладки, либо символы новой строки, но не обе. Есть ли способ сделать это эффективным способом?

1 Ответ

1 голос
/ 19 мая 2019

Внесение следующего изменения (замена значения allSQL выводом метода .replace объекта String) приводит к желаемому выводу:

NON_PRINTABLE = """\r\n\t"""
def parseSQLFile(filename):
    with open(filename, 'r') as sqlFile:
        allSQL = sqlFile.read()
        # replace specific control characters with spaces to prevent sql compiler errors
        for char in NON_PRINTABLE:
            allSQL = allSQL.replace(char,' ') #updating allSQL with returned value

    return allSQL

выход:

'select  s.id  ,s.src_cnt  ,s.out_file  from  kpi_index_ros.composites s  ,kpi_index_ros.kpi_index_rosoards d where  1 = 1  and s.kpi_index_rosoard_id (+) = d.id  and d.active = 1 ;'

Что касается второй части вашего вопроса - относительно эффективности такого подхода, вам, вероятно, следует обратиться к результатам теста в этом ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...