多括号嵌套文本拆分分块
前言
因在写代码时,代码是三段式source{{}} transform{{}}sink{{}},为了便于测试,故对源文本拆分做成withsql格式,方便代码测试。同时对多组大括号的内容进行转换为对双引号的拆分。
代码如下(此处因想尝试写class,所以构造如下)
# coding=utf-8
import os
import re
class withSql(object):
def __init__(self):
pass
#文件读取
def read_txt(self,path):
with open(path) as f:
data = f.read()
return data
#数据拆分为source,trransform,sink
def pars(self,path):
data=self.read_txt(path)
source = data[:data.find('transform')]
transform = data[data.find('transform'):data.find('sink')]
sink = data[data.find('sink'):]
return source,transform,sink
#source 获取临时表与对应sql内容
def str_source(self,path):
source=self.pars(path)[0].splitlines()
vt_source_table_name=[]
vt_source_sql=[]
for str in source:
str1=str.strip()
num1=str1.strip().replace(' ','').find('result_table_name=')
num2 = str1.strip(' ').replace(' ','').find('pre_sql=')
if num1 <>-1:
str1 = str1.split('"')[1]
vt_source_table_name.append(str1)
elif num2 <> -1:
str1 = str1.split('"')[1]
vt_source_sql.append(str1)
return vt_source_table_name,vt_source_sql
#合并source的临时表与对应sql
def source_conbine(self,path):
vt_source_table_name, vt_source_sql=self.str_source(path)
sql=''
for i in range(0,len(vt_source_table_name)):
sql=sql+','+vt_source_table_name[i]+' as\n('+vt_source_sql[i]+')\n'
source_sql='with '+sql[1:]
return source_sql
# 拆分trnsform的临时表与对应sql,里面的递归循环单独处理
def str_transform(self,path):
transform=self.pars(path)[1].splitlines()
vt_transform_table_name=[]
vt_transform_sql=[]
sql=''
str_count = 0
for str in transform:
str1=str.strip()
num1=str1.strip().replace(' ','').find('result_table_name=')
num2 = str1.strip(' ').replace(' ','').find('sql=')
num3 = str1.strip(' ').replace(' ','').find('sqlDependencyRecursion')
if num1 <>-1:
str1 = str1.split('"')[1]
vt_transform_table_name.append(str1)
elif num2 <> -1:
str1=str1.split('"')[1]
vt_transform_sql.append(str1)
elif num3 <> -1:
print('有递归循环')
vt_transform_sql.append(str)
str_count=6
elif str_count >0:
sql=sql+str
#print(sql)
# print(vt_transform_sql)
list_len=len(vt_transform_sql)
# print(list_len)
vt_transform_sql[list_len-1]=sql
str_count=str_count-1
if str_count==0:
sql=''
return vt_transform_table_name,vt_transform_sql
#合并transform的临时表名与对应sql
def transform_conbine(self,path):
vt_transform_table_name, vt_transform_sql=self.str_transform(path)
transform_sql=''
for i in range(0,len(vt_transform_table_name)):
transform_sql=transform_sql+','+vt_transform_table_name[i]+' as\n('+vt_transform_sql[i]+')\n'
return transform_sql
# 将合并的source结果与transform结果合并
def withSqlCombine(self,path):
source_sql=self.source_conbine(path)
transform_sql=self.transform_conbine(path)
withsqlcombine=source_sql+transform_sql
return withsqlcombine
# 保存改造后的with语句
def to_txt(self,path):
withsqlcombine=self.withSqlCombine(path)
save_path=path.split('\.')[0]+'_withsql'+'.txt'
with open(save_path,'w') as f:
f.write(withsqlcombine)
print('打印完成')
#文件地址
path=r'C:\txt\a.txt'
#实例化对象
withsql=withSql()
#调用方法
withsql.to_txt(path)
总结
优点:此篇的方案可实现对多段文本的拆分,不限于括号。同时对多组大括号的内容进行转换为对双引号的拆分。能够快速生成想要的代码形式。
不足:未能形成桌面小程序,使用不是太方便。(后续有空实现吧)