python解析TXT

总体思路:根据配置表的切分字段,对字符串也就是txt内容进行切割,使用的是坐标的范围。
第二阶段:处理切割的特殊字符,处理如果切割的字符不在TXT内报错的处理。

# *coding:utf-8 *
import pymysql
import config
import utils

connect = pymysql.connect(config.src_db_host, config.src_db_user, config.src_db_pwd, config.src_db_name,
                              charset='utf8')

def parseTXTMain(admission_id):
    # 第一步传递流水号 ,查询获取txt
    res=getTXT(admission_id)   # 接收到一条查询到的消息,一条记录信息
    for i in range(len(res)):
        text=res[i][3] #获取这条记录信息中的txt内容
        # print(text)
        file_name=res[i][2] #文书名
        # 第二步 解析txt
        text_return=paseText(text,file_name) #返回的是一个集合,类似res一样,集合套元祖的形式
        # 第三步 输出内容到数据库
        writeToMysql(res[i],text_return)


# 具体方法1第一步:传递流水号 ,查询获取txt
def getTXT(admission_id):
    sql = 'SELECT A.SYXH,A.QTBLJLXH,A.BLMC, B.BLNR from EMR_QTBLJLK A JOIN BRBLNR B ON A.QTBLJLXH=B.QTBLJLXH WHERE A.SYXH=%s'
    with connect.cursor() as connCurse:
         connCurse.execute(sql,admission_id)
         return connCurse.fetchall() # 返回查询的结果

# 具体方法2第二步:传递文书内容进行解析,首先将存在于text中的关键字提取出来,用提取出来的进行分割,要不然会报错,报没有这个字符切割的错误
def paseText(text,file_name):
    text_return = []
    exists_word=[]
    # 文书名file_name与tag_info关联,查询出section_nmae,control_name,根据规则切分
    sql="SELECT section_name,tag_name,file_name from 10001_tag_info WHERE file_name=%s"
    content=str(text)
    with connect.cursor() as connCurse:
        connCurse.execute(sql,file_name)
        taginfo = connCurse.fetchall()
        # print(taginfo) # 打印获取到的taginfo表中筛选出来的内容
        content_text=''
        index2=0
        for e in range(len(taginfo)): # 首先将有效的分割放到一个数组中去,然后遍历有效分割词的数据
            if str(taginfo[e][1]) in text or str(taginfo[e][1]).replace('^n','') in text:
                exists_word.append((taginfo[e][0],str(taginfo[e][1]).replace('^n','')))
        for i in range(len(exists_word)):
            print(exists_word[i])
            index1 = str(text).index(exists_word[i][1]) #获取截取的下标1
            if i >= len(exists_word)-1:  # 判断如果循环是倒数第1个的话,就截取其余全部
                index2=len(text)  #将text最大坐标赋值给index2
                # print(index2)
            else:
                index2 = str(text).index(exists_word[i+1][1]) #判断如果循环不是最后一个,就截取下一个坐标
            section_name = exists_word[i][0]
            control_name = exists_word[i][1] # control_name就是截取的关键字
            content_text = content[index1+len(exists_word[i][1]):index2] #content_text是根据下标截取的
            # print(control_name,'--',content_text)
            # 如果section_name 长度不为空,就拼接,但是拼接的时候
            text_return.append((section_name,control_name,content_text))
        #print(text_return)
    return  text_return


# 具体方法3第三步,将解析后的数据放回数据库,新增了功能是拼接,如果section_name不是空的就拼接造一个字段,用于显示
def writeToMysql(res,text_return):

    sql="INSERT INTO 10001_rough_base_copy(control_name,section_name,admission_id,content_text,file_name,file_id,doc_name) VALUES(%s,%s,%s,%s,%s,%s,%s)"
    with connect.cursor() as connCurse:
        admission_id=res[0]
        file_id=res[1]
        file_name=res[2]
        # 加功能,如果section_name一样的话,就做字符串拼接,这里我们用字典的属性解决这个问题
        d = {}
        for i in range(len(text_return)):  # i表示独立的一份file_id
            section_name = str(text_return[i][0])
            control_name = text_return[i][1].replace(':','').replace(':','').replace(' ','').replace(' ','')
            content_text = text_return[i][2]
            if len(section_name)>0: #这种情况说明要拼接了
                d.setdefault(section_name,'')
                d[section_name] +=content_text
                # print(d[section_name]+content_text)    # 这样就持续拼接
            connCurse.execute(sql,[control_name,section_name,admission_id,content_text,file_name,file_id,file_name])
        # 遍历字典 e是k,d[e]是v
        for e in  d:
            connCurse.execute(sql,[e,'', admission_id, d[e], file_name, file_id, file_name])
        connect.commit()

# 调用一下看效果
parseTXTMain(134040133)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值