Python - Разделить файл на несколько файлов для каждого вхождения указанной c строки - PullRequest
0 голосов
/ 03 августа 2020

У меня есть один файл с несколькими хранимыми процедурами, как показано ниже.

--
-- Name: abc(character varying); Type: FUNCTION; Schema: schema_name; Owner: -
--
CREATE FUNCTION schema_name.abc(schema_name character varying) RETURNS opaque
    LANGUAGE plpgsql
    AS '54:-1', $$
    
DECLARE
 a  INT:= 0;
 b  INT:= 0;

BEGIN 
        
 
 END;

$$;


--
-- Name: bcd(); Type: FUNCTION; Schema: schema_name; Owner: -
--

CREATE FUNCTION schema_name.bcd() RETURNS opaque
    LANGUAGE plpgsql
    AS '-1', $$         

DECLARE
 a  INT:= 0;
 b  INT:= 0;

BEGIN 
    
 
 END;
    $$;


--
-- Name: cde(); Type: FUNCTION; Schema: schema_name; Owner: -
--

CREATE FUNCTION schema_name.cde() RETURNS opaque
    LANGUAGE plpgsql
    AS '-1', $$         

DECLARE
 a  INT:= 0;
 b  INT:= 0;

BEGIN 
    

 
 END;
    $$;

Мне нужно разделить его на каждый отдельный файл процедуры, который начинается с

--
-- Name:

Также отдельные файлы должны быть названы по имени схемы. В этом случае имена файлов должны быть ab c. sql, bcd. sql, cde. sql ..

Пока что я пробовал это

token = 'CREATE FUNCTION'
chunks = []
current_chunk = []

for line in open('procedures.txt'):
   if line.startswith(token) and current_chunk: 
      chunks.append(current_chunk[:])
      current_chunk = []
   current_chunk.append(line)
   print (current_chunk)

chunks.append(current_chunk) 

1 Ответ

1 голос
/ 03 августа 2020

Попробуйте следующее:

import os

path = r"D:\test"

token = '-- Name: '
chunks = {}
current_chunk = []


with open (os.path.join(path, "test.txt"), "r") as myfile:
    data=myfile.readlines()

for line in data:
    if line.startswith(token):
        start = line.find("token")+len(token)
        end = line.find("(")
        schema_name = line[start:end].strip()
        
        current_chunk = []
        current_chunk.append(line)
        chunks[schema_name] = current_chunk
    else:
        current_chunk.append(line)

print (chunks)

for name, storage in chunks.items():
    print(name)
    with open(os.path.join(path, name + '.sql'), 'w') as file:
        file.write(" ".join(storage))
        file.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...