0 前言
0.1 背景
作为IVD(In Vitro Diagnostic,体外诊断)行业的临床相关从业者,工作中存在大量的技术含量低、机械、重复的工作,但是IVD企业的临床部门一般不会有很细的分工,所有工作都由CRA(Clinical Research Associate,临床监察员)包办,导致CRA被这些技术含量低、机械、重复的工作束缚。大多数CRA并不掌握编程相关知识,但CRA的许多工作又非常适合通过程序自动完成。由此我想到从零开始学习编程,并将学习的过程、体会、结果记录下来,以期能够对同行的工作有一些帮助。
0.2 语言选择
看了网上的一些介绍,感觉对于0编程基础的职场人来说,Python应该是最合适的选择。Python功能强大,有丰富的第三方库,优秀的教程多……所以最终选择了Python。
0.3 学习资料
由于完全没有基础,第一步想要先对编程有个最初步的认识,所以选择了中国大学MOOC上北理工的Python语言程序设计这门课先学习一些基础知识。
1 项目一 受试者姓名转拼音缩写
1.1 背景
在临床试验中,为了保护受试者隐私,所以在所有临床试验相关文件中受试者的姓名均以拼音缩写替代。
1.1.1 缩写规则
一般缩写均为4位大写字母,具体规则为:
姓名为2个汉字的,取每个汉字的前2位拼音;
姓名为3个汉字的,取前2个汉字的第1位拼音,加第3个汉字的前2位拼音;
姓名为4个汉字的,取每个汉字的第1位拼音。
存在特殊情况,汉字中存在单音节字,当患者姓名中存在这些单音节字且同时按照上述缩写规则需要取2位拼音的,第2位以符号“-”补齐。
1.1.2 示例
示例如下:
姓名:科比,缩写:KEBI
姓名:嫦娥,缩写:CHE-
姓名:川建国,缩写:CJGU
姓名:安倍晋三,缩写:ABJS
1.2 开发过程
刷了三节Python网课,知道怎么引用第三方库了、了解了数字类型和字符串类型以及一些处理方法,第一个就想到姓名缩写这个又没有技术含量又日常要干的活,感觉自己可以了,跃跃欲试。
1.2.1 汉字转拼音
1.2.1.1 寻找合适的第三方库
这个姓名最重要的部分就是把汉字转化成对应的拼音,在百度上直接搜“python汉字转拼音”,发现AI推荐了pypinyin这个第三方库,还给出了一部分示例,感觉能满足需求之后就选择了这个库。
1.2.1.1 第三方库安装
第一座大山来了,AI告诉我:
首先需要安装这个库:
pip install pypinyin
在Python中输入并运行发现报错,但是怎么看我都没写错。一番查询后发现并不是在Python里输入,而是在命令行里输入。果断Win+R然后cmd。
1.2.1.2 汉字转拼音
AI给出的示例:
from pypinyin import pinyin, Style
def chinese_to_pinyin(text, style=Style.TONE3):
return ''.join([y[0] for y in pinyin(text, style=style)])
# 示例
text = "中国"
pinyin_text = chinese_to_pinyin(text)
print(pinyin_text) # 输出可能是 'zhongguo' 或 'zhōngguó' 等,取决于所需的声调
尝试了一下发现pinyin函数返回的拼音是带声调的,但是我并不想要声调,就去搜索pypinyin,看看有没有更适合我的函数,发现了lazy_pinyin返回的是不带声调的拼音,尝试了一下成功了。
from pypinyin import lazy_pinyin
hanzi = input()
print(lazy_pinyin(hanzi))
1.2.1.3 字符串转换
运行之后得到:
输入:科比
输出:['ke', 'bi']
1.2.2 导入受试者姓名
1.3 最终代码
最终完成后的代码如下,相关代码已发布在:1.飞桨、2.inscode
#用于临床试验中患者姓名缩写自动转换
#先安装所需的第三方库
pip install pandas
pip install openpyxl
pip install pypinyin
from pypinyin import lazy_pinyin
import pandas as pd
from openpyxl import load_workbook
from openpyxl import Workbook
wb = load_workbook('test.xlsx')#读取test.xlsx文件
ws = wb.active
for col in ws.iter_cols(min_col=1, max_col=1, values_only=True):
for Hanzi in col:
if len(Hanzi) == 2:
Hanzi1 = Hanzi[0]
Hanzi2 = Hanzi[1]
print(str.upper(str(lazy_pinyin(Hanzi1)))[2:4], end='')
print(str.upper(str(lazy_pinyin(Hanzi2)))[2:4])
elif len(Hanzi) == 3:
Hanzi1 = Hanzi[0]
Hanzi2 = Hanzi[1]
Hanzi3 = Hanzi[2]
print(str.upper(str(lazy_pinyin(Hanzi1)))[2], end='')
print(str.upper(str(lazy_pinyin(Hanzi2)))[2], end='')
print(str.upper(str(lazy_pinyin(Hanzi3)))[2:4])
elif len(Hanzi) == 4:
Hanzi1 = Hanzi[0]
Hanzi2 = Hanzi[1]
Hanzi3 = Hanzi[2]
Hanzi4 = Hanzi[3]
print(str.upper(str(lazy_pinyin(Hanzi1)))[2], end='')
print(str.upper(str(lazy_pinyin(Hanzi2)))[2], end='')
print(str.upper(str(lazy_pinyin(Hanzi3)))[2], end='')
print(str.upper(str(lazy_pinyin(Hanzi4)))[2])
else:
print("姓名错误,请检查后重试")
1.4 不足
对于1.1.1 缩写规则中提到的单音节字的特殊情况暂不能完美处理。