DIY一个简易查询系统

前段时间应网友需求计划做一个简洁的”中药毒副作用查询”小工具

原料:

网友们提供了不少资料.最简洁的还属这个名单:
http://www.meoncn.cn/Item/3595.aspx

期望

我们预期一下我们希望做出一个什么东东,它应该:
可以展示资料里的药物及其属性关系.

例如:
“柴胡”对应
小柴胡片、小柴胡颗粒、得生丸、安坤赞育丸。;柴胡皂苷
能导致肾上腺肥大、胸腺萎缩,使人体免疫功能降低。
有肾毒性,能损害肾脏。

查这种对应关系,显然数据库最擅长这个了.但我们的程序很小并不是很适合添加现有的数据库模型.
那让我们自己来实现一个简单的数据库查询系统吧.

DIY数据格式

当我们明确了需求,下一步就是将原料数据经过最少的工序成本转换为满足现有需求并具有一定扩展能力的且适合处理的内容.

原数据已经分类很清楚,存储方法这里采用线性存储(因为数据只有不到一百条的样子),我首先关注如何将不同药物分开以及药物之间属性项目的分割.

我用”{}”来分割药物,用”;”来分割属性.
让我们来看现在是不是顺眼一些:

{柴胡;小柴胡片、小柴胡颗粒、柴胡口服液、柴胡舒肝丸、小儿热速清口服液、午时茶颗粒、牛黄清心丸、气滞胃痛颗粒、龙胆泻肝丸、加味逍遥丸、护肝片、补中益气丸、乳疾灵颗粒、逍遥丸、消食退热糖浆、通乳颗粒、黄连羊肝丸、得生丸、清瘟解毒丸、舒肝和胃丸、感冒清热颗粒、鼻渊舒口服液、鼻窦炎口服液、平肝舒络丸、安坤赞育丸。;柴胡皂苷;能导致肾上腺肥大、胸腺萎缩,使人体免疫功能降低。有肾毒性,能损害肾脏。;}
{马兜铃;龙胆泻肝丸、耳聋丸、八正丸(散)、纯阳正气丸、大黄清胃丸、当归四逆丸(汤)、导赤丸(散)、甘露消毒丹(丸)、排石颗粒、跌打丸、妇科分清丸、冠心苏合丸、苏合丸、辛荑丸、十香返生丸、济生桔核丸、止嗽化痰丸、八正合剂、小儿金丹片(丸)、分清五淋丸、安阳精制膏、辛夷丸、儿童清肺丸、九味羌活丸(颗粒、口服液)、川节茶调丸(散)、小儿咳喘颗粒、小青龙合剂(颗粒);马兜铃酸;马兜铃、关木通、天仙藤、青木香、广防己、汉中防己、细辛、追风藤、寻骨风、淮通、朱砂莲、三筒管、杜衡、管南香、南木香、藤香、背蛇生、假大薯、蝴蝶暗消、逼血雷、白金果榄、金耳环、乌金草,可能与上述药材混用而搀杂马兜铃酸的药材:木通、苦木通、紫木通、白木通、川木通、预知子、木防己、铁线莲、威灵仙、香防己、白英、白毛藤、大青木香等。马兜铃酸为肾毒素,能造成肾小管大量丧失,导致肾衰竭,是典型的“中草药肾病”,病情严重者需要终身做血液透析或肾移植。马兜铃酸也是潜在的致癌物质,动物实验表明,食用马兜铃酸会导致淋巴瘤、肾癌、肝癌、胃癌和肺癌。;//注意本条由于是马兜铃作为引用,如果再版希望数据能够改善.}

因为网页格式直接复制导致文本中很多回车,为了便于编辑和整理我们决定在每项的后面也就是”}”的后面加一个回车.那怎么办到呢?
首先删除所有回车,使用notepad++中的查找替换功能,.然后再用notepad++中替换功能在扩展模式,查找目标为}替换为}\r\n 当然这里要灵活使用啦.

自定义格式的读取

我们的格式为
{独活;天麻丸、壮骨关节丸 抱龙丸;*;有肾毒性,可导致肾脏衰竭.;}
第一项是”主属性”,通过对主属性的匹配得出本条是否为查询结果.
如果不匹配直接找下一个{
如果匹配则向后读取,将”;”分割的各项读出.结束本次读取内容.

寻找这些特殊标记无论是”;”还是”{}”,都可以通过ifstream.get来完成,它可以逐个char字符读取.这样的隐患是无法对比文字和中文标点符号.
接下来匹配主属性.因为我们的属性都是通过”;”来分割的,ifstream.getline,改函数的优点是第三个参数可以指定读到什么内容时停止.

ifstream in=Null;
in.getline(cName, 1024, ';');//';'作为分隔
                if (0 == strcmp(cName, "独活"))
                {

这样cName的内容就是第一项属性的内容.
再次执行则读取第二项属性.
我们只需要将这些属性输入即可.

输入与输出

一个好的界面着实难以设计,但是命令行窗口也未免过于不友好.
所以掌握简单的界面设计是必要的.这里我用的是MFC.

效果如图:
DIY一个简易查询系统_第1张图片

本项目是公开源码的,所以你可以看到整个代码.
项目地址是:
http://code.taobao.org/svn/AntiZYwin32App/

后语

更进一步,网友希望能够根据第二项中的小项为索引检索整个内容.你有什么好的主意?
做一些实用的完整小项目,可能对人更有意义.
2015年10月19日 10:56:34

你可能感兴趣的:(有趣-好玩)