对多个嵌套括号的文本进行拆分

文章介绍了一个Python类`withSql`,用于处理三段式代码结构,拆分源文本并转换为withsql格式,便于测试。该类能处理多组大括号内容,将其转化为双引号分块,支持递归循环处理。虽然目前只能以命令行方式运行,但能有效提高代码组织和测试效率。
摘要由CSDN通过智能技术生成

前言

因在写代码时,代码是三段式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)

总结

优点:此篇的方案可实现对多段文本的拆分,不限于括号。同时对多组大括号的内容进行转换为对双引号的拆分。能够快速生成想要的代码形式。
不足:未能形成桌面小程序,使用不是太方便。(后续有空实现吧)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值