python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表

#!/user/bin/evn python
import os,re,openpyxl
'''
    输入:帆软脚本文件路径
    输出:帆软文件检查结果Excel
'''
#获取来源表
def table_scan(sql_str):
    # remove the /* */ comments

    q = re.sub(r"/\*[^*]*\*+(?:[^*/][^*]*\*+)*/", "", sql_str)
    # remove whole line -- and # comments
    lines = [line for line in q.splitlines() if not re.match("^\s*(--|#)", line)]

    # remove trailing -- and # comments
    q = " ".join([re.split("--|#", line)[0] for line in lines])

    # split on blanks, parens and semicolons
    tokens = re.split(r"[\s)(;]+", q)

    # scan the tokens. if we see a FROM or JOIN, we set the get_next
    # flag, and grab the next one (unless it's SELECT).

    result = []
    get_next = False
    for token in tokens:
        if get_next:
            if token.lower() not in ["", "select"]:
                #过滤掉因条件设置选择来源表而产生的脏数据非表名字符
                if '"+if' not in token and '"'not in token and '$if' not in token and '${if' not in token:
                    result.append(token.replace('`',''))
            get_next = False
        get_next = token.lower() in ["from", "join"]
    #特殊单独情况处理:from后面来源表条件选择对应来源表,比如from ${if(XX,"来源表A","来源表B")}
    # print(result)
    if not result:
        tab_pat=re.compile(r'from.*?if\((.*?)\)',re.S)
        for i in re.findall(tab_pat,sql_str):
            temp_r=i.replace('"','').split(',')
            if '' not in temp_r and '/*' not in temp_r:
                result.append(temp_r[1].replace('`','').strip())
                result.append(temp_r[2].replace('`','').strip())
    return result

#文件扫描,使用正则解析第一版,准确性不太高!
def file_scan(path):
    f_content=open(path,'r',encoding='utf-8').read()

    #1、数据集查询
    sqlgpat=re.compile('(.*?)',re.S)
    if_has_sqlg=re.findall(sqlgpat,f_content)
    rs_sql_list=[]
    if if_has_sqlg:
        #获取数据集名称以及数据集查询语句
        sqlspat=re.compile('\n.*?\n.*?',re.S)
        rs1=re.findall(sqlspat,if_has_sqlg[0])
        for rsv in rs1:
            from_tables=[]
            if '"*/"' in rsv[1]:
                sql=rsv[1].split('*/')
                for ss in sql:
                    from_tables.extend(table_scan(ss))
            else:
                from_tables.extend(table_scan(rsv[2]))
            rs_sql_list.append([rsv[0],rsv[1],rsv[2],set(from_tables)])
            # print(rsv[1])

    #2、js获取
    if_has_jsgpat=re.compile('' in jscon:
                # rlpat=re.compile('\s',re.S)
                rlpat = re.compile( '', re.S)

                rl=re.findall(rlpat,jscon)[0]
                # print(re.findall(rlpat,jscon))
                if rl not in rep_list:
                    rep_list.append(rl)
            elif '' in jscon:
                wlpat=re.compile('\s',re.S)
                wl=re.findall(wlpat,jscon)[0]
                if wl not in rep_list:
                    rep_list.append(wl)
            elif re.search(conturlpat,jscon):
                frl=re.findall(conturlpat,jscon)[0]
                print(frl)
                if not frl.startswith('/'):
                    frl='/'+frl
                if frl not in rep_list:
                    rep_list.append(frl)
            # elif ''in jscon and('.cpt' in jscon or '.frm' in jscon) :
            #     print(jscon)

    if_has_cljpat=re.compile(r'

扫描文件夹:

python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表_第1张图片

运行结果

python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表_第2张图片

python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表_第3张图片 

你可能感兴趣的:(python,python,xml,sql,帆软,finereport,cpt,frm)