基于AHK和SQLite实现的快速查找
工作中常常有这样的需求:在SDTM转换过程中,需要查找某个指标得到对应的code,类似于字典结构的key-value之间的关系。而相应的参考文档为excel文件,其中包含7000多条数据,经常需要复制指标然后去excel里进行筛选查找,无论是考虑搜索效率或是自动化实现都略有不足,因此使用AHK和SQLite进行高效快速查找。
思路
-
将excel导出为SQLite数据库
-
采用DB Browser for SQLite程序进行查找
-
AHK实现自动化功能
还有一些其他的思路:
-
查找步骤由程序完成后返回结果,AHK直接复制最准确的结果到剪切板
缺点:返回结果只有一个,且不一定是想要的那个结果 -
使用类似于代码补全的工具,输入对应的文字返回相应的多条记录
放弃原因:没找到该类工具,自己实现有难度且浪费时间(输入法的词库功能勉勉强强,只能做好一个大而全的库以后才能有比较好的对应关系)
1. Excel导出SQLite数据库
这里我使用Python的pandas、sqlalchemy库,来读取Excel并输出SQLite数据库
相应的Python代码
import os
import pandas as pd
from sqlalchemy import create_engine
# 设定工作目录
os.chdir(os.path.dirname(__file__))
# 读取1.xls中的Sheet表单
df = pd.read_excel('1.xls',sheet_name='Sheet')
# 生成sdtm.db数据库,表名为terminology
engine = create_engine('sqlite:///sdtm.db')
df.to_sql('terminology',engine,index=False)
2. 利用DB Browser for SQLite查找相应的字段
DB Browser for SQLite是一款免费开源工具(以下简称SQLite工具
),支持中文,打开后可以在图示位置进行搜索
3. AHK实现自动化功能
我打算实现选择某段文字,按下快捷键后跳转到SQLite工具
得到搜索结果。
于是我采取以下步骤实现:
- 复制选择文字(相当于按下
Ctrl+C
) - 利用CMD命令打开
sdtm.db
(需要设置db文件的默认程序为SQLite工具
) - 自动化点击浏览数据,并在搜索框输入复制得到的文字
以下是相关代码:
app.ahk
;---------------搜索受控术语--------------------
;调整窗口大小函数,避免相对坐标发生变化
ResizeWin(Width = 0,Height = 0)
{
WinGetPos,X,Y,W,H,A
if %Width% = 0
Width := W
if %Height% = 0
Height := H
WinMove,A ,,%X%,%Y%,%Width%,%Height%
}
;搜索函数,包含点击步骤
Search()
{
CoordMode, Mouse, Client
Click, 123,64
Click, 536,95
Send, ^a
Send, ^v
Click, 273,495
Click, 320,170
}
#s:: ;按下win+S执行搜索
clipboard:=
Send, ^{c}
ClipWait
;判断软件是否已经打开
if WinExist("ahk_exe DB Browser for SQLite.exe")
{
WinActivate
ResizeWin(1000,610)
Search()
}
if !WinExist("ahk_exe DB Browser for SQLite.exe")
{
Run, cmd /c start D:\work\tools\query\sdtm.db
;循环判断软件是否处于前台激活状态
while True{
if WinActive("ahk_exe DB Browser for SQLite.exe"){
ResizeWin(1000,610)
Search()
Break
}
}
}
return
;---------------搜索受控术语--------------------