Python создает oneliner для многострочного текста в sqlnet.ora

#python #python-3.x

#питон #python-3.x

Вопрос:

У меня есть следующий текст:

 SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(MD5,SHA1)
WALLET_LOCATION=
(SOURCE=
(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=/oracle/.wallets)
)
)
SQLNET.WALLET_OVERRIDE=TRUE
  

и хотите получить это в результате:

 SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(MD5,SHA1)
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/oracle/.wallets)))
SQLNET.WALLET_OVERRIDE=TRUE
  

Какой наиболее эффективный способ сделать это с помощью родного Python (без дополнительных внешних пакетов)?

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

Правка1. Мне не нужно точное решение. По крайней мере, просто алгоритм.

Комментарии:

1. Если у вас возникла конкретная проблема при самостоятельном решении этой проблемы, вы можете задать ее здесь с вашим кодом.

2. Мне нужен хотя бы способ эффективного решения этой задачи.

Ответ №1:

Один из способов, который вы можете сделать, это использовать номер строки для начала и конца, а затем объединить все строки между ними. Кстати, я сохранил ваш текст в файле, но вы также можете напрямую добавить его в код.

 file1 = open('myfile.txt', 'r') 
Lines = file1.readlines() 

count = 0
lineNumStart, lineNumEnd = 1, 7
outStringJoined = ""
for line in Lines: 
    if count>=lineNumStart and count<lineNumEnd:
        outStringJoined  = line.strip()
    else:
        outStringJoined  = line
    count =1
print(outStringJoined)
  

Чтобы сделать его более гибким, вы можете использовать пару, такую как («(«, «)»). Если первый элемент пары найден, то код будет продолжать объединение до тех пор, пока не будет найдена соответствующая пара!

Комментарии:

1. Дело в том, что я заранее не знаю, где находится многострочная переменная (текст выше — это всего лишь небольшой фрагмент файла). Чтобы удалить все новые строки, я могу использовать регулярное выражение. Это не то, чего я хотел. Но в любом случае спасибо, что уделили мне время.

Ответ №2:

 with open('sqlnet.ora', 'r') as file:
    sqlnetora = file.read()
sqlnetora = re.sub(r'  ', '', re.sub(r'n ', 'n', sqlnetora))
                .replace(' n','n')
text_list = sqlnetora.splitlines()
is_mvar = False # flag if we are working with multiline parameter
oneliner = []   # list with one-line parameters
mvar = []       # list for multiline parameter
for line in text_list:
    po = line.count('(')
    pc = line.count(')')
    # this is not multiline parameter
    if not is_mvar:
        if line[-1:] == ')' and po == pc:
            oneliner.append(line)
        elif line[-1:] != '=' and po == pc:
            oneliner.append(line)
        # we've found start of multiline parameter
        else:
            mpo = line.count('(')
            mpc = line.count(')')
            is_mvar = True
            mvar.append(line)
    # this is multiline parameter
    else:
        mpo  = po
        mpc  = pc
        # if this is last line for multiline parameter?
        if mpo == mpc:
            mvar.append(line)
            oneliner.append(('').join(mvar))
            mvar.clear()
            is_mvar = False
        # this is not last line of multiline parameter
        else:
            mvar.append(line)
print(*oneliner, sep='n')