56  获取检验数据

56.1 微生物检验

56.1.1 通过时间区间、科室、检验分组、获取病人住院号列表

# 通过时间区间、科室、检验分组、获取病人住院号列表
import json
import requests
import pandas as pd
import sys


deptCodeDict = {'icu1':'LIS1033', 'icu2':'LIS5537', 'icu3':'LIS5578'}    # icu1对应的科室名称是ICU,不是重症医学科
deptNameDict = {'icu1':'重症医学科一区', 'icu2':'重症医学科二区', 'icu3':'重症医学科三区'}



def getPatientListByDeptDateRangeTestGroup(DeptCode, DateRangeStart, DateRangeEnd, TestGroupCode):
    '''
    三区的DeptCode是LIS5578,微生物报告的TestGroupCode是G012
    DateRangeStart和DateRangeEnd的格式是20240218
    '''

    url = 'http://200.100.101.197:10010/api/Serve/GetSamples'
    headers = {
    "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", # 说明data是以urlencode传过去的,而不是以json传过去的。这个属性不能注释掉。
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0",
    }
    form_data = f'QueryField=%5B%7B%22KEY%22%3A%22INSPECTION_DATES%22%2C%22VALUE%22%3A%22{DateRangeStart}%22%2C%22OPERATER%22%3A%22%3E%3D%22%2C%22TYPE%22%3A%223%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22INSPECTION_DATEE%22%2C%22VALUE%22%3A%22{DateRangeEnd}%22%2C%22OPERATER%22%3A%22%3C%3D%22%2C%22TYPE%22%3A%223%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22PATIENT_WARD%22%2C%22VALUE%22%3A%22{DeptCode}%22%2C%22OPERATER%22%3A%22%3D%22%2C%22TYPE%22%3A%222%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22GROUP_ID%22%2C%22VALUE%22%3A%22{TestGroupCode}%22%2C%22OPERATER%22%3A%22IN%22%2C%22TYPE%22%3A%2210%22%2C%22TYPEKEY%22%3A%22GROUP_ID%22%7D%2C%7B%22KEY%22%3A%22PATIENT_TYPE%22%2C%22VALUE%22%3A%22%22%2C%22OPERATER%22%3A%22IN%22%2C%22TYPE%22%3A%221%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22PDF_FLAG%22%2C%22VALUE%22%3A%22%22%2C%22OPERATER%22%3A%22%3D%22%2C%22TYPE%22%3A%221%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22PRINT_STATE%22%2C%22VALUE%22%3A%22%22%2C%22OPERATER%22%3A%22%3D%22%2C%22TYPE%22%3A%221%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22INSPECTION_STATE%22%2C%22VALUE%22%3A%22send%2Caudited%2Csent%2Cfinished%2Creported%2Cissued%22%2C%22OPERATER%22%3A%22IN%22%2C%22TYPE%22%3A%2210%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%5D&Order=+ORDER+BY++PATIENT_WARD%2CFILTERDATE+DESC&DbType=Oracle&QueryType=4&SearchFields=REQUISITION_ID%2COUTPATIENT_ID%2CPATIENT_NAME%2CINPATIENT_ID&FuzzyQuery=1&HospitalId=&OutpatientIdField=OUTPATIENT_ID&PageSize=0&PageNum=0'
    
    # form_data = 'QueryField=%5B%7B%22KEY%22%3A%22INSPECTION_DATES%22%2C%22VALUE%22%3A%2220240201%22%2C%22OPERATER%22%3A%22%3E%3D%22%2C%22TYPE%22%3A%223%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22INSPECTION_DATEE%22%2C%22VALUE%22%3A%2220240229%22%2C%22OPERATER%22%3A%22%3C%3D%22%2C%22TYPE%22%3A%223%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22PATIENT_WARD%22%2C%22VALUE%22%3A%22LIS5578%22%2C%22OPERATER%22%3A%22%3D%22%2C%22TYPE%22%3A%222%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22GROUP_ID%22%2C%22VALUE%22%3A%22G012%22%2C%22OPERATER%22%3A%22IN%22%2C%22TYPE%22%3A%2210%22%2C%22TYPEKEY%22%3A%22GROUP_ID%22%7D%2C%7B%22KEY%22%3A%22PATIENT_TYPE%22%2C%22VALUE%22%3A%22%22%2C%22OPERATER%22%3A%22IN%22%2C%22TYPE%22%3A%221%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22PDF_FLAG%22%2C%22VALUE%22%3A%22%22%2C%22OPERATER%22%3A%22%3D%22%2C%22TYPE%22%3A%221%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22PRINT_STATE%22%2C%22VALUE%22%3A%22%22%2C%22OPERATER%22%3A%22%3D%22%2C%22TYPE%22%3A%221%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%2C%7B%22KEY%22%3A%22INSPECTION_STATE%22%2C%22VALUE%22%3A%22send%2Caudited%2Csent%2Cfinished%2Creported%2Cissued%22%2C%22OPERATER%22%3A%22IN%22%2C%22TYPE%22%3A%2210%22%2C%22TYPEKEY%22%3A%22FILTERDATE%22%7D%5D&Order=+ORDER+BY++PATIENT_WARD%2CFILTERDATE+DESC&DbType=Oracle&QueryType=4&SearchFields=REQUISITION_ID%2COUTPATIENT_ID%2CPATIENT_NAME%2CINPATIENT_ID&FuzzyQuery=1&HospitalId=&OutpatientIdField=OUTPATIENT_ID&PageSize=0&PageNum=0'
    res = requests.post(
        url,
        headers=headers,
        data=form_data,
    )

    patient_list_df = pd.DataFrame(json.loads(res.text)['rows'])

    patient_list_df.to_csv(f'{deptName}-{dateRangeStart}{dateRangeEnd}期间_微生物检验报告.csv', index=False)

    '''
    STATE_COLOR_IDX==9.0是危急值,STATE_COLOR_IDX==8.0异常值,STATE_COLOR_IDX==0.0是正常值(无细菌培养出)
    '''

    return patient_list_df


def getMicrobioTestByINSPECTION_ID(INSPECTION_ID):
    '''
    三区的DeptCode是LIS5578,微生物报告的TestGroupCode是G012
    DateRangeStart和DateRangeEnd的格式是20240218
    '''

    url = 'http://200.100.101.197:10010/Common/GetSqlJson'
    headers = {
    "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", # 说明data是以urlencode传过去的,而不是以json传过去的。这个属性不能注释掉。
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0",
    }


    # 痰涂片信息(即耐药菌的名称)
    form_data_result_name = f"XML_NAME=%E6%A3%80%E9%AA%8C%E6%8A%A5%E5%91%8A&NODE_NAME=%E8%8E%B7%E5%8F%96%E6%B6%82%E7%89%87%E5%9F%B9%E5%85%BB%E7%BB%93%E6%9E%9C%E4%BF%A1%E6%81%AF&PARAMETERS={INSPECTION_ID}&DB_TYPE=LIS"
    
    # 结果解读信息
    form_data_result_explain = f"XML_NAME=%E6%A3%80%E9%AA%8C%E6%8A%A5%E5%91%8A&NODE_NAME=%E8%8E%B7%E5%8F%96%E7%BB%93%E6%9E%9C%E8%A7%A3%E8%AF%BB%E4%BF%A1%E6%81%AF&PARAMETERS={INSPECTION_ID}&SQL_WHERE=+AND+LOWER(A.MICRO_DATA_ID)%3D'mic12254'+&DB_TYPE=LIS"
    
    # 详细药敏信息
    form_data_drugsenstivity = f"XML_NAME=%E6%A3%80%E9%AA%8C%E6%8A%A5%E5%91%8A&NODE_NAME=%E8%8E%B7%E5%8F%96%E8%8D%AF%E6%95%8F%E7%BB%93%E6%9E%9C%E7%BB%93%E6%9E%9C%E4%BF%A1%E6%81%AF&PARAMETERS={INSPECTION_ID}&SQL_WHERE=+AND+LOWER(A.MICRO_DATA_ID)%3D'mic12254'+&DB_TYPE=LIS"
    

    res = requests.post(
        url,
        headers=headers,
        data = form_data_result_name,
    )


    return pd.DataFrame(json.loads(res.text))




# 启动应用
if __name__ == '__main__':

    '''
    使用方法:python patientlist.py icu3 20230101 20231231
    '''

    if len(sys.argv) < 3:
        print('参数不完整')

    else:
        dept = sys.argv[1]  # 第一个参数是patientlist.py,因此需要取第2个参数
        dateRangeStart = sys.argv[2]
        dateRangeEnd = sys.argv[3]
        deptCode = deptCodeDict[dept]
        deptName = deptNameDict[dept]
        testGroupCode = "G012"
        patientlist = getPatientListByDeptDateRangeTestGroup(DeptCode = deptCode, 
                                                            DateRangeStart = dateRangeStart, 
                                                            DateRangeEnd = dateRangeEnd, 
                                                            TestGroupCode = testGroupCode)
        
        # patientlist = pd.read_csv('微生物检验报告.csv')

        positive_patientlist_df = patientlist.query('STATE_COLOR_IDX==9.0 | STATE_COLOR_IDX==8.0')[['INSPECTION_ID', 'PATIENT_NAME', 'INPATIENT_ID', 'TEST_ORDER_NAME','CHECK_TIME']]

        testResultDFList = []
        for INSPECTION_ID in positive_patientlist_df.INSPECTION_ID.values:
            testResultDF = getMicrobioTestByINSPECTION_ID(INSPECTION_ID)
            testResultDFList.append(testResultDF)
    
        
        testResultDFConcat = pd.concat(testResultDFList)


        # testResultDFConcat = pd.read_csv('重症三区2023年耐药菌结果_无住院号.csv')

        testResultDFConcat.to_csv(f'{deptName}-{dateRangeStart}{dateRangeEnd}期间_耐药菌结果_无住院号.csv',index = False)

        result = patientlist.merge(testResultDFConcat, on = 'INSPECTION_ID')[['PATIENT_DEPT_NAME','INSPECTION_ID', 'PATIENT_NAME', 'PATIENT_SEX_TEXT', 'PATIENT_AGE', 
                                                                                'INPATIENT_ID', 'SAMPLE_CLASS_NAME', 'TEST_ORDER_NAME','CHECK_TIME', 
                                                                                'MICRO_DATA_ID_NAME','REMARK_y']]
        

        result.to_csv(f'{deptName}-{dateRangeStart}{dateRangeEnd}期间_耐药菌结果.csv',index = False)

56.2 PDF检验报告提取

56.2.1 需提取数据

import pandas as pd

targetData = pd.read_excel('data/何绮珊课题数据表.xlsx').head()

print(targetData.columns)
Index(['姓名', '性别', '年龄', 'C反应蛋白', '白细胞总数', '中性粒细胞绝对值', '淋巴细胞绝对值', '单核细胞绝对值',
       '嗜酸性粒细胞绝对值', '嗜碱性粒细胞绝对值', '中性粒细胞百分比', '淋巴细胞百分比', '单核细胞百分比', '嗜酸性粒细胞百分比',
       '嗜碱性粒细胞百分比', '红细胞总数', '血红蛋白浓度', '血小板计数', '纤维蛋白原', 'D-二聚体', '尿素氮', '钠',
       '钾', '氯', '钙', '碱性磷酸酶', '谷丙转氨酶', '甘油三酯 ', '总胆固醇', '白蛋白', '球蛋白',
       '高密度脂蛋白胆固醇', '低密度脂蛋白胆固醇', '载脂蛋白A1', '载脂蛋白B ', '载脂蛋白E', '肌酐', '尿酸',
       '同型半胱氨酸', '空腹血糖', '糖化血红蛋白', '乙型肝炎病毒表面抗原', '梅毒螺旋体抗体'],
      dtype='object')

56.2.2 提取PDF文本

# PDF文件读取

import pdfplumber

pdf_file = ('data/包胜峰.pdf')
with pdfplumber.open(pdf_file) as pdf:
    pages = pdf.pages
    content = ""
    for pg in pages:
        content = content + pg.extract_text()        
print(content)
扫 更
一 方
检验报告单
扫 便
100838762800
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 1613
科  室: 神经内二科 床  号:32 送检医生: 王昕昊 标本种类: 全血
申请项目: 血常规+血型+CRP 标本状态:
NO 项       目 结  果 单  位 参 考 区 间 项       目 结  果 单  位 参 考 区 间
1 有核红细胞绝对值(NRBC#) 0.00 10^9/L 0 16 嗜酸性粒细胞比例(EO%) 3.0 % 0.5-5.0
2 有核红细胞绝比例(NRBC%) 0.00 % 17 嗜碱性粒细胞比例(BA%) 0.4 % 0-1
3 超敏C反应蛋白(hs-CRP) >5.00 ↑ mg/L <1 18 红细胞(RBC) 4.02 10^12/L 4.0-5.5
4 快速C反应蛋白(CRP) 5.49 mg/L <10 19 血红蛋白(HGB) 124.00 g/L 120-160
5 ABO血型(微柱法)(ABO) O 20 红细胞压积(HCT) 36.60 ↓ % 40.0-50.0
6 Rh血型(微柱法)(RhD(IgM))阳性(+) 21 红细胞平均体积(MCV) 91.00 fL 80-100
7 白细胞(WBC) 5.67 10^9/L 4.0-10 22 红细胞平均血红蛋白(MCH) 30.80 pg 27-31
8 中性粒细胞绝对值(NE#) 3.11 10^9/L 2-7.0 23 平均红细胞HB浓度(MCHC) 339.00 g/L 320-360
9 淋巴细胞绝对值(LYM#) 1.67 10^9/L 0.8-4 24 红细胞分布宽度SD 38.4 ↓ fL 39-46
10 单核细胞绝对值(MO#) 0.70 10^9/L 0.12-0.8 25 红细胞分布宽度异数(RDW) 11.3 ↓ % 11.5-14.5
11 嗜酸性细胞绝对值(EO#) 0.17 10^9/L 0.02-0.50 26 血小板(PLT) 143.00 10^9/L 100-300
12 嗜碱性粒细胞绝对值(BA#) 0.02 10^9/L 0.00-0.10 27 血小板容积比(PCT) 0.160 % 0.108-0.28
13 中性粒细胞比例(NE%) 54.80 % 50-70 28 血小板平均体积(MPV) 10.90 fL 7.0-11.0
14 淋巴细胞比例(LY%) 29.5 % 20-40 29 血小板分布宽度(PDW) 12.90 9-17
15 单核细胞比例(MO%) 12.3 ↑ % 3-8 30 大血小板比率(P-LCR) 32.60 % 17.5-42.3
备注:
采集时间: 2023-05-04 12:06:27 采集人: 2665 接收人: 陈美霞 检验者:
签收时间: 2023-05-04 14:05:11 专业组: 临检组 仪器名:XN9000_1 审核者:
报告时间: 2023-05-04 17:20:54 申请时间: 2023-05-04 10:52:34
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第1 页/共1页
扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 0059
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 全血
申请项目: 糖化血红蛋白(色谱法) 标本状态: 合格
项       目 结  果 单  位 参考区间
1 糖化血红蛋白(HbA1C) 9.20 ↑ % 4-6
备注:
采集时间: 2023-03-21 08:19:50 采集人: 6835 接收人: 梁耀文 检验者:
签收时间: 2023-03-21 09:18:34 专业组: 免疫组 仪器名:LD600
审核者:
报告时间: 2023-03-21 13:53:27 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第1 页/共1页扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 3677
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血清
申请项目: 肝功一 标本状态: 合格
NO 项       目 结  果 单  位 参 考 区 间
1 谷丙转氨酶(ALT) 19.70 U/L 0-40
2 总蛋白(TP) 75.60 g/L 57-83
3 白蛋白(ALB) 34.80 ↓ g/L 35-52
4 球蛋白(GLB) 40.80 ↑ g/L 15-30
5 白蛋白/球蛋白(A/G) 0.85 ↓ 1-2.5
6 总胆红素(TBIL) 13.20 umol/L 5-21
7 直接胆红素(DBIL) 1.10 umol/l 0.0-3.4
8 间接胆红素(IBIL) 12.10 umol/L 1.6-17.6
9 谷胱甘肽还原酶(GR) 50.00 U/L 33-73
备注:
送检时间: 2023-03-21 08:19:50 采集人: 6835 接收人: 梁耀文 检验者:
签收时间: 2023-03-21 09:12:52 专业组: 生化流水线组 仪器名:DM2
审核者:
报告时间: 2023-03-21 13:27:45 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第1 页/共5页
扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 3677
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血清
申请项目: 空腹血糖 标本状态: 合格
NO 项       目 结  果 单  位 参 考 区 间
1 空腹血糖(GLU) 12.29 ↑ mmol/L 4.3-5.9
备注:
送检时间: 2023-03-21 08:19:50 采集人: 6835 接收人: 梁耀文 检验者:
签收时间: 2023-03-21 09:12:52 专业组: 生化流水线组 仪器名:DM2
审核者:
报告时间: 2023-03-21 13:27:45 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第2 页/共5页扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 3677
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血清
申请项目: 肾功一 标本状态: 合格
NO 项       目 结  果 单  位 参 考 区 间
1 尿素氮(Bun) 6.26 mmol/L 2.8-7.6
2 尿酸(UA) 442.00 ↑ umol/L 208.3-428.4
3 肌酐(CREA) 104.30 umol/L 35-127
4 胱抑素C(CysC) 0.97 mg/L 0-1.4
备注:
送检时间: 2023-03-21 08:19:50 采集人: 6835 接收人: 梁耀文 检验者:
签收时间: 2023-03-21 09:12:52 专业组: 生化流水线组 仪器名:DM2
审核者:
报告时间: 2023-03-21 13:27:45 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第3 页/共5页
扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 3677
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血清
申请项目: 心脑一 标本状态: 合格
NO 项       目 结  果 单  位 参 考 区 间
1 甘油三酯(TG) 1.71 mmol/L 0.41-1.86
2 总胆固醇(CH) 3.44 mmol/L 2.9-5.7
3 高密度脂蛋白胆固醇(HDLC) 0.99 mmol/L 0.83-1.96
4 低密度脂蛋白胆固醇(LDLC) 2.12 mmol/L 2.07-3.1
5 载脂蛋白A1(APOA) 1.08 ↓ g/L 1.2-1.8
6 载脂蛋白B(APOB) 0.61 g/L 0.6-1.14
7 载脂蛋白E(APOE) 23.54 ↓ mg/L 27-49
备注:
送检时间: 2023-03-21 08:19:50 采集人: 6835 接收人: 梁耀文 检验者:
签收时间: 2023-03-21 09:12:52 专业组: 生化流水线组 仪器名:DM2
审核者:
报告时间: 2023-03-21 13:27:45 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第4 页/共5页扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 3677
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血清
申请项目: 血同型半胱氨酸测定 标本状态: 合格
NO 项       目 结  果 单  位 参 考 区 间
1 同型半胱氨酸(HCY) 9.36 umol/L <15
备注:
送检时间: 2023-03-21 08:19:50 采集人: 6835 接收人: 梁耀文 检验者:
签收时间: 2023-03-21 09:12:52 专业组: 生化流水线组 仪器名:DM2
审核者:
报告时间: 2023-03-21 13:27:45 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第5 页/共5页
扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 1008
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血清
申请项目: 术前四项定量 标本状态: 合格
项       目 结  果 单  位 参考区间
1 乙肝表面抗原定量(HBSAG) 0.06 ng/ml 0-0.50
2 丙型肝炎病毒抗体定量(HCV) 0.01 COI 0-1.0
3 梅毒特异性抗体定量(TP) 0.04 COI 0-1.0
4 人免疫缺陷病毒抗体定量(HIV) 0.03 COI 0-1.0
备注:
采集时间: 2023-03-20 14:14:53 采集人: 6733 接收人: 梁耀文 检验者:
签收时间: 2023-03-20 15:57:20 专业组: 免疫组 仪器名:CHEMCLIN1500
审核者:
报告时间: 2023-03-21 11:27:36 申请时间: 2023-03-20 11:31:56
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第1 页/共1页扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 0499
科  室: 神经内二科 床  号:87 送检医生: 冯锦文 标本种类: 血浆
申请项目: 止凝血四+DII聚体 标本状态: 合格
项       目 结  果 单  位 参考区间
1 凝血酶原时间(PT) 11.40 S 10.7-14.4
2 凝血酶原活度(PTA) 105.00 % 70-160
3 凝血酶原比值(PT-R) 0.98 0.85-1.15
4 凝血酶原国际标准化比值(PT-INR) 0.98 0.82-1.15
5 衍算纤维蛋白原(DFBG) 3.00 g/L 2.0-4.0
6 纤维蛋白原(FBG) 2.89 g/L 2.0-4.0
7 活化部分凝血酶时间(APTT) 26.60 S 23.3-32.5
8 部分凝血酶时间(TT) 16.8 S 14.0-21.0
9 D-二聚体(D-D) 210.00 ug/L 0-550
备注:
采集时间: 2023-03-20 14:14:53 采集人: 6733 接收人: 梁耀文 检验者:
签收时间: 2023-03-20 15:58:08 专业组: 门急诊组 仪器名:CN6000
审核者:
报告时间: 2023-03-20 17:59:41 申请时间: 2023-03-20 11:30:26
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第1 页/共1页
扫 更
一 方
检验报告单
扫 便
姓  名: 包胜峰 性  别: 男 年  龄: 58岁 病历号: 857306 样本编号: 0753
科  室: 神经内二科 床  号:22 送检医生: 蔡秀颜 标本种类: 血清
申请项目: 急诊生化七项 标本状态: 合格
项       目 结  果 单  位 参考区间
1 尿素氮(BUN) 4.38 mmol/L 3.0-9.2
2 二氧化碳(CO2) 33.00 ↑ mmol/L 22-29
3 钠(NA) 137.00 mmol/L 135-145
4 钾(K) 4.30 mmol/L 3.5-5.5
5 氯(CL) 100.00 mmol/L 96-108
6 钙(CA) 2.36 mmol/L 2.03-2.54
7 葡萄糖(GLU) 19.97 ↑ mmol/L 3.89-6.11
备注:
采集时间: 2022-12-05 16:39:18 采集人: 6335 接收人: 梁耀文 检验者:
签收时间: 2022-12-05 17:19:13 专业组: 门急诊组 仪器名:C16000
审核者:
报告时间: 2022-12-05 19:03:53 申请时间: 2022-12-05 15:14:42
备注:检验结果只对所检测标本负责,仅供临床医生诊疗参考,不明之处,请向专科医师咨询。祝您健康! 第1 页/共1页

56.2.3 提取姓名、性别、年龄、住院号

import re

patternDict = {
  '姓名': r'姓\s*名:\s*([\u4e00-\u9fa5]+)',
  '性别': r'性\s*别:\s*([\u4e00-\u9fa5]+)',
  '年龄': r'年\s*龄:\s*(\d+)岁',
  '住院号': r'病历号:\s*(\d+)',
}

dt = dict()

for key, val in patternDict.items():
    extractVal = re.findall(val, content)[0]
    dt[key] = extractVal
    print(extractVal)
包胜峰
男
58
857306
pd.DataFrame([dt])
姓名 性别 年龄 住院号
0 包胜峰 58 857306

56.2.4 提取血常规指标

‘C反应蛋白’, ‘白细胞总数’, ‘中性粒细胞绝对值’, ‘淋巴细胞绝对值’, ‘单核细胞绝对值’,‘嗜酸性粒细胞绝对值’, ‘嗜碱性粒细胞绝对值’, ‘中性粒细胞百分比’, ‘淋巴细胞百分比’, ‘单核细胞百分比’, ‘嗜酸性粒细胞百分比’, ‘嗜碱性粒细胞百分比’, ‘红细胞总数’, ‘血红蛋白浓度’, ‘血小板计数’,

xcgPattern = {
    "超敏C反应蛋白": r"C反应蛋白\(hs-CRP\)(.*?)mg/L",
    "快速C反应蛋白": r"C反应蛋白\(CRP\)(.*?)mg/L",
    "白细胞总数": r"白细胞\(WBC\)(.*?)10\^9/L",
    "中性粒细胞绝对值": r"中性粒细胞绝对值\(NE#\)(.*?)10\^9/L",
    "淋巴细胞绝对值": r"淋巴细胞绝对值\(LYM#\)(.*?)10\^9/L",
    "单核细胞绝对值": r"单核细胞绝对值\(MO#\)(.*?)10\^9/L",
    "嗜酸性粒细胞绝对值": r"嗜酸性细胞绝对值\(EO#\)(.*?)10\^9/L",
    "嗜碱性粒细胞绝对值": r"嗜碱性粒细胞绝对值\(BA#\)(.*?)10\^9/L", 
    '中性粒细胞百分比': r"中性粒细胞比例\(NE%\)(.*?)%", 
    '淋巴细胞百分比': r"淋巴细胞比例\(LY%\)(.*?)%", 
    '单核细胞百分比': r"单核细胞比例\(MO%\)(.*?)%", 
    '嗜酸性粒细胞百分比': r"嗜酸性粒细胞比例\(EO%\)(.*?)%", 
    '嗜碱性粒细胞百分比': r"嗜碱性粒细胞比例\(BA%\)(.*?)%", 
    '红细胞总数': r"红细胞\(RBC\)(.*?)10\^12/L", 
    '血红蛋白浓度': r"血红蛋白\(HGB\)(.*?)g/L", 
    '血小板计数': r"血小板\(PLT\)(.*?)10\^9/L",
}


for key, val in xcgPattern.items():
    extractVal = re.findall(val, content)[0].strip("↑↓ ")
    dt[key] = extractVal
    print(extractVal)
>5.00
5.49
5.67
3.11
1.67
0.70
0.17
0.02
54.80
29.5
12.3
3.0
0.4
4.02
124.00
143.00
pd.DataFrame([dt])
姓名 性别 年龄 住院号 超敏C反应蛋白 快速C反应蛋白 白细胞总数 中性粒细胞绝对值 淋巴细胞绝对值 单核细胞绝对值 嗜酸性粒细胞绝对值 嗜碱性粒细胞绝对值 中性粒细胞百分比 淋巴细胞百分比 单核细胞百分比 嗜酸性粒细胞百分比 嗜碱性粒细胞百分比 红细胞总数 血红蛋白浓度 血小板计数
0 包胜峰 58 857306 >5.00 5.49 5.67 3.11 1.67 0.70 0.17 0.02 54.80 29.5 12.3 3.0 0.4 4.02 124.00 143.00

56.2.5 批量处理

# 遍历data文件夹里的pdf文件
import os

dts = []

for f in os.listdir('data'):
    if f.lower().endswith(".pdf"):
        pdf_file = f"data/{f}"
        
        # 提取文本内容
        with pdfplumber.open(pdf_file) as pdf:
            pages = pdf.pages
            content = ""
            for pg in pages:
                content = content + pg.extract_text()   
        
        dt = dict()
        
        # 提取姓名、性别、年龄、住院号
        for key, val in patternDict.items():
            extractVal = re.findall(val, content)[0]
            dt[key] = extractVal
            
        # 提取血常规指标
        for key, val in xcgPattern.items():
            result = re.findall(val, content)
            if result:
                extractVal = re.findall(val, content)[0].strip("↑↓ ")
            else:
                # print(key, val, pdf_file)
                extractVal = None
            dt[key] = extractVal
        
        # 添加至数据框列表
        
        dts.append(dt)
        
pd.DataFrame(dts)
姓名 性别 年龄 住院号 超敏C反应蛋白 快速C反应蛋白 白细胞总数 中性粒细胞绝对值 淋巴细胞绝对值 单核细胞绝对值 嗜酸性粒细胞绝对值 嗜碱性粒细胞绝对值 中性粒细胞百分比 淋巴细胞百分比 单核细胞百分比 嗜酸性粒细胞百分比 嗜碱性粒细胞百分比 红细胞总数 血红蛋白浓度 血小板计数
0 包胜峰 58 857306 >5.00 5.49 5.67 3.11 1.67 0.70 0.17 0.02 54.80 29.5 12.3 3.0 0.4 4.02 124.00 143.00
1 曹佳燕 51 468065 None None 5.81 3.63 1.64 0.35 0.14 0.05 62.40 28.2 6.1 2.4 0.9 5.65 126.00 285.00
2 蔡成恒 72 988053 1.36 <5.00 6.07 3.67 1.85 0.49 0.05 0.01 60.40 30.5 8.1 0.8 0.2 5.81 136.00 156.00
3 包胜峰 58 857306 >5.00 5.49 5.67 3.11 1.67 0.70 0.17 0.02 54.80 29.5 12.3 3.0 0.4 4.02 124.00 143.00
4 蔡李仔 57 974901 None None 9.60 7.85 1.36 0.32 0.05 0.02 81.80 14.2 3.3 0.5 0.2 4.66 135.00 203.00
5 蔡良昌 38 790110 None <5.00 7.00 3.67 2.50 0.64 0.13 0.06 52.40 35.8 9.1 1.9 0.8 5.03 156.00 252.00