总体思路:根据配置表的切分字段,对字符串也就是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)
python解析TXT
最新推荐文章于 2024-06-05 13:52:09 发布