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

CREATE TABLE address(

    location_pk integer NULL,

    City varchar(50) NULL, 

    Address1 varchar(50) NULL, 

    Address2 varchar(50) NULL, 

CREATE TABLE name(

    idinteger NULL,

    City varchar(50) NULL, 

    RootDCTKey integer NULL, 

    Class varchar(50) NULL, 

CREATE TABLE location(

    location_pk integer NULL,

    City varchar(50) NULL, 

    Rootkey integer NULL, 

Мне нужно добавить ");" и удалите запятую ',' после того, как каждый конец таблицы будет выглядеть так:

CREATE TABLE address(

    location_pk integer NULL,

    City varchar(50) NULL, 

    Address1 varchar(50) NULL, 

    Address2 varchar(50) NULL ); 

CREATE TABLE name(

    idinteger NULL,

    City varchar(50) NULL, 

    RootDCTKey integer NULL, 

    Class varchar(50) NULL );

CREATE TABLE location(

    location_pk integer NULL,

    City varchar(50) NULL, 

    Rootkey integer NULL );

Мой подход - записать исправленную версию файла в другой файл.

opFile1 = open('txtfile.txt','rb').readlines()
finalfile = open('finaltxtfile.txt','wb')

for i,line in enumerate(opFile1):

    if not line.startswith('CREATE TABLE'):
        finalfile.write(line)
    else:
        #overwrite the last written line with the corrected line
        finalfile.write(opFile1[i-2].rstrip(',')+' );')

        #write the original 'CREATE TABLE' line
        finalfile.write(line)

Этот подход просто добавляет исправленную строку перед строкой CREATE TABLE и не удаляет исходную неправильную строку. Пожалуйста, помогите с вашими идеями. Благодарность :)

0
Bhaskar Bhuyan 29 Авг 2017 в 13:33

3 ответа

Лучший ответ

Надеюсь это поможет. Для каждой строки с помощью перечисляемого индекса проверьте, начинается ли следующая за следующей строкой CREATE (я сделал это CREATE, вы можете изменить строку по своему усмотрению). Если да, выполните замену line.replace(',',');') и напишите строку. Нам также нужно заменить последнюю строку; Это добавляется как условие в if как or i+1==len(opFile1). i+2<len(opFile1) существует для того, чтобы индекс не выходил за пределы.

opFile1 = open('txtfile.txt','r').readlines()
finalfile = open('finaltxtfile.txt','w')

for i,line in enumerate(opFile1):
    if i+2<len(opFile1) and opFile1[i+2].startswith('CREATE') or i+1==len(opFile1):
        finalfile.write(line.replace(',',');'))
    else:
        finalfile.write(line)
finalfile.close()

Кстати, вы использовали двоичные режимы rb, wb для записи ненужной строки, я изменил ее на нормальные режимы r и w.

2
officialaimm 29 Авг 2017 в 11:05

Вы можете просто использовать re, чтобы сделать работу:

finalfile.write(re.sub(b'NULL,(\s*\n*)(CREATE|\Z)', rb'NULL);\1\2', opFile1))
1
fernandezcuesta 29 Авг 2017 в 11:12

Если файл не большой, я бы не стал обрабатывать каждую строку. Я просто прочитал бы весь файл в переменную, выполнил поиск / замену последней запятой и затем записал переменную в новый файл (или в исходный файл).

1
Mike 29 Авг 2017 в 10:58