Как добавить;после данного экземпляра с использованием Python 3 - PullRequest
0 голосов
/ 04 июня 2019

Итак, у меня есть текстовый файл с содержанием ниже:

CREATE EXTERNAL TABLE `table1`(
  `tab_id bigint COMMENT 'The unique identifier of thetable')
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 
* 
OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1556u3ehw27')
CREATE EXTERNAL TABLE `aud2`(
  `application_id` bigint COMMENT 'Unique Id that represents each application created')
COMMENT 'contains application level details. every application will have one entry'
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 
* 
OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1trh7')

Я пытаюсь написать программу, которая вставляет; в частности, после последних скобок после tblproperties. Таким образом, вывод должен быть таким:

CREATE EXTERNAL TABLE `table1`(
  `tab_id bigint COMMENT 'The unique identifier of thetable')
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 
* 
OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1556u3ehw27');
CREATE EXTERNAL TABLE `audit_application`(
  `application_id` bigint COMMENT 'Unique Id that represents each application created')
COMMENT 'contains application level details. every application will have one entry'
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 
* 
OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1trh7');

Вот мой заявленный код, но он не запускается, но он удаляет все после последнего), а это не то, что я хочу:

f = open("/home/files", 'rt', encoding='latin-1')
source=f.read()

with open("/home/files/sampl8.sql","w") as output:
    output.write(source[:source.find(')')+1].replace('"', ''))

Есть идеи или предложения?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы можете использовать re.sub, чтобы найти и заменить все экземпляры TBLPROPERTIES() на TBLPROPERTIES();:

import re

f = open("/home/files", 'rt', encoding='latin-1')
source=f.read()

with open("/home/files/sampl8.sql","w") as output:
    output.write(re.sub(r'(TBLPROPERTIES \(.*?\))', r'\1;', f, flags=re.DOTALL))
0 голосов
/ 04 июня 2019

Вы можете просто найти точные строки с помощью регулярных выражений и заменить их, как показано ниже.Используя set, просто убедитесь, что мы не заменяем дубликаты.

import re

t = '''
CREATE EXTERNAL TABLE `table1`(
  `tab_id bigint COMMENT 'The unique identifier of thetable')
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 
* 
OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1556u3ehw27')
CREATE EXTERNAL TABLE `aud2`(
  `application_id` bigint COMMENT 'Unique Id that represents each application created')
COMMENT 'contains application level details. every application will have one entry'
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 
* 
OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1trh7')
'''

for i in set(re.findall(r'TBLPROPERTIES \(.*?\)', t, flags=re.DOTALL)):
    t = t.replace(i, i + ';')

print(t)

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