返回列表 发帖

[LIS] 研究了一下JAVA做的接口+正则表达式解析文本

从我做LIS开始,就有一个愿望:通过字符串来解析字符串。
最开始想用类似于逻辑尺一样的东西来过滤,不过没成功,后来知道了一种强大的东西叫正则表达式,就开始考虑使用正则表达式来解析仪器数据。
大约是2005年的时候,第一次尝试使用正则表达式解析仪器数据,解析本身还算成功,但是由于各种原因,没有使用,然后一直放着,直到今年5月份(感慨一下,一晃11年了),重新学习了正则表达式,马上制作了一个解释测试程序,发现简单的数据解析起来挺正常。后来想想不如加上串口接收的部分,做个技术预览版的接口程序,于是动工做了这个小程序。


软件大体上是在6月份做好的,但是中间有点事情,耽误了一下,没有往细了做,最近又拣起来,稍微润色了润色,马上发出来与大家同享。


其实做这个程序,很大程度上是想测试一下两个低功耗的开发平台
1,raspberry pi 3 + ubuntu ,优点就是特别安静,低功耗,接上显示器,和电脑的感觉是一样的。缺点就是慢,特别慢。而且由于是ARM环境,不能用RXTX的串口。
2,小米平板2 + win10,优点还是特别安静,低功耗,速度也还行,最大的优点是可以躺在床上写程序。缺点就是屏幕小,看着费劲。


界面的样式是从网上抄的,完全用java实现,可以最小化到屏幕右下角。
串口接收部分,使用了RXTX,安装好理论上是可以实现跨平台,当然,除了ARM平台。
简单测试了自动应答和自动定时发送。

设置

UI_setting.png
2016-10-13 23:03



---------------------------
这是核心部分
则表达式的设置。测试了几种老仪器的数据,新机器的数据没有,没测。基本上还算成功。有些数据需要自己加小数点,这个功能没有加,毕竟就是一个技术验证,没做得很细。做肯定是没有问题的。
一开始只捕获一组数据,后来想起来尿有定量和定性两种结果,又加入了一组捕获。
正则表达式本身想捕获多少都行,就是程序要能接收到不同组的数据。

思路就是先验证数据的完整性,把一组数据完整的剥离出来,然后把数据继续拆分,从中捕获样品号,项目/通道号,定量结果,定性结果。

有些仪器的数据没有通道号或项目号,可以让程序用序号替代,或是用户按顺序指定项目名称。

项目和结果基本上是在一行数据中一起捕获出来
ui_in.png
2016-10-13 23:03



----------------------------
接收到的数据和解析好的数据,只能显示,还不能写到数据库,没做这功能。
ui_re.png
2016-10-13 23:03





-----------------
关于
ui_about.png
2016-10-13 23:03




--------------------------
相比于正常的通过程序解析字符串,正则表达式易读性上稍差,虽然程序读着也困难,但是可以写注释,过一个月,想不起来怎么写的,跑起来设断点看看,就知道了,但是正则不太好设断点,哪出问题不好查。

至于效率,理论上可能要快些,没测过,也没办法测,写一个循环取子串啥的,也是可以做优化的,没优化前,没有可比性。


也和同行们浅浅聊了聊,有用的,但很少,主要还是传统的方法解析。希望以后越来越多吧。


最后,JAVA不只可以写web,还可以做桌面程序。
收藏 0
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

本帖最后由 约翰羊 于 2016-10-13 23:36 编辑

程序放不放呢?先不放了,毕竟就是个技术预览版,有想了解的朋友,联系我,我给你单独发,咱们再讨论。
解析的脚本是测试好以后,固化在程序里的,没单独放在外边保存,主要就是为了少写点代码。

目前测试的是以下几种机型,有需要脚本的留言,我发出来。

e.png
2016-10-13 23:36
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

再占个楼

TOP

为啥用java做呢,比较慢啊,推荐nodejs或者python
云计算机

TOP

回复 4# ericdai


   java比较熟悉,准备用python再做一个
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

个人觉得有时解析得慢一点无所谓,毕竟这种仪器数据可以忍受一定程度的延迟;
不知道是否是可以兼容很多设备,目前看还是比较少;
JAVA没说只能做WEB,做数据库都可以
You are your master!

TOP

回复 6# cucumberman


   我简单测试了几种有代表性的数据,比如说老生化那种一大行的数据,还有i2000这样的,还有国产尿的数据,还有一些血球数据。都能解析。不是所有的仪器都能用这种方式,但大多数理论上讲应该是可以的。如果兄弟有数据,也可以发给我,我测试一下。

   正则表达式最优势的地方,就是用字符串解析字符串,不用改动程序。




   java被应用很广的是web相关的东西,很少很少有人用它来做桌面程序,所以我说了一句,不只可以做web,也可以做桌面。



  
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

用python靠谱

TOP

以前都是硬解析
海邦轻量级HIS系统
http://www.jsask.cn

TOP

回复 9# yisuylm


   这个.....硬解是什么?
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

回复 10# 约翰羊


   就是直接写程序 ,直接分析,老羊 你把源码放上来呢?或者把正则表达式源码放上来
云计算机

TOP

回复 11# ericdai


   代码写的比较乱,等我再修修,半成品可以发上来
   需要JDK/JRE  1.8以上版本,还要安装一个RXTX串口的东西。
   
    收费附件: AecthSerial.rar

AecthSerial.rar (1.79 MB)

售价: 金币 1 枚  [记录]  [购买]

我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

回复 11# ericdai


   还没有迭代过,也没怎么测试过,纯技术验证,所以错误难免,发现有什么地方不对,麻烦告诉我,我来改代码。
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

回复 11# ericdai


  
  1. Script s = new Script();
  2.         s.setEquipmentName("AU2700");
  3.         s.setRecondScript("\\x02([^\\x03]+)\\x03");
  4.         s.setSampleIDScript("\\s([EP0-9]{4})\\s+");
  5.         s.setResultScript("[^D]\\s{0,1}{0,1}[E\\sHhRr]{1}([0-9]{2})\\s+(\\d+(\\.\\d+)?)");
  6.         scriptGroup.put("AU2700", s);

  7.         s = new Script();
  8.         s.setEquipmentName("1650");
  9.         s.setRecondScript("\\x02([^\\x03]+)\\x03");
  10.         s.setSampleIDScript("[\\dN]{16}([\\d]{1,4})\\s+");
  11.         s.setResultScript("([\\d\\s]{3})M((.{11}))");  //\\s+([-]{0,1}\\d+(\\.\\d+)?)[hHlL]{0,1}\\s
  12.         scriptGroup.put("1650", s);

  13.         s = new Script();
  14.         s.setEquipmentName("7020");
  15.         s.setRecondScript("\\x02([^\\x03]*)\\x03");
  16.         s.setSampleIDScript("(?:[qQnNfF]\\s+)((\\d+))\\s+");
  17.         s.setResultScript("(?:^.{15}\\s+\\d+\\s)|(\\d{1,2})\\s+((\\d+\\.{0,1}\\d*\\s*))");
  18.         scriptGroup.put("7020", s);


  19.         s = new Script();
  20.         s.setEquipmentName("CD1800");
  21.         s.setRecondScript("\\x02\\\"\\s+\\\"([^\\x03]+)\\x03");
  22.         s.setSampleIDScript("\\\"\\d{2}:\\d{2}\\\",\\\"((.{16}))\\\",");
  23.         s.setResultScript(",(([-\\d]{5}))");
  24.         String itemCodeList = new String();
  25. for(char c='A';c<'z';c++){
  26.             itemCodeList = itemCodeList +c+",";
  27.         }
  28.         s.setCustomerItemCodeList(itemCodeList);   //null 项目列表,因为是用序号当  itemCodeList
  29.         scriptGroup.put("CD1800", s);

  30.         s = new Script();
  31.         s.setEquipmentName("Axsym");
  32.         s.setRecondScript("(?:\\x02\\dH\\|.+[^.]*(\\x02\\d[POR]{1}\\|.*[^.]*)+\\x02\\dL\\|\\d)+");   //\\x02\\dH\\|\\\\.+[\\r\\n]{1,2}\\x03[\\dA-Z]{2}[\\r\\n]{1,2}\\x02\\dP\\|.+[\\r\\n]{1,2}\\x03[\\dA-Z]{2}[\\n\\r]{1,2}((?:\\x02\\dO\\|.+[\\n\\r]{1,2}\\x03[\\dA-Z]{2}[\\r\\n]{1,2})+(?:\\x02\\dR\\|\\d\\|.*[\\r\\n]{1,2}\\x03[\\dA-Z]{2}[\\r\\n]{1,2})+)+\\x02\\dL\\|\\d
  33.         s.setSampleIDScript("\\x02\\dO\\|\\d\\|\\|((\\d+))\\^.+[\\n\\r]{1,2}\\x03");
  34.         s.setResultScript("(?:\\x02\\dR\\|\\d\\|\\^+(\\d+)\\^+[A-z\\d-_\\^]+([FP]){1}\\|(([0-9\\.]+))\\|.*[\\n\\r]{1,2}\\x03)+");
  35.         s.setItemCodeAddPos(2);
  36.         s.setQuanValuePos(3);
  37.         scriptGroup.put("Axsym", s);

  38.         s = new Script();
  39.         s.setEquipmentName("H300");
  40.         s.setRecondScript("(\\x02[^\\x03]*\\x03)+?");
  41.         s.setSampleIDScript("[NnOo]{2}\\.\\s:((\\d+))+");
  42.         s.setResultScript("[\\s\\*]{1}([A-z]{2,3})\\s{1,2}([0-9]{0,1}[\\+\\-]{0,2})\\s{0,14}(\\d*(\\.\\d+)*).*");  //\\s([A-z]{2,3})\\s+([\\+\\-\\s]*)\\s+(([0-9.]*))\\s+
  43.         s.setQuanValuePos(3);
  44.         s.setQualValuePos(2);
  45.         scriptGroup.put("H300", s);

  46.         s = new Script();
  47.         s.setEquipmentName("Urit1500");
  48.         s.setRecondScript("(\\x02[^\\x03]*\\x03)+?");
  49.         s.setSampleIDScript("[NnoO\\.]{3}((\\d+))\\s");
  50.         s.setResultScript("[\\*\\s]{1}([A-z]{2,3})\\s{1,2}([\\+\\-0-9|(Normal)]*)\\s{0,13}(\\d*(\\.\\d+)*)");  //[\\*\\s]{1}([A-z]{2,3})\\s+([\\+\\-\\s0-9]*|Normal)\\s+(([0-9.]*|Normal[\\r\\n]{1,2}))[A-z]*
  51.         scriptGroup.put("Urit1500", s);

  52.         s = new Script();
  53.         s.setEquipmentName("CA500");
  54.         s.setRecondScript("(\\x02[^\\x03]*\\x03)");
  55.         s.setSampleIDScript("\\s((\\d+))M\\s");
  56.         s.setResultScript("([0-9]{3})\\s(([0-9\\.\\s]{5}))");
  57.         scriptGroup.put("CA500", s);

  58. //        s = new Script();
  59. //        s.setEquipmentName("WJniao");
  60. //        s.setRecondScript("€((.*)[\\r\\n]{1,2})*?\\x0c");
  61. //        s.setSampleIDScript("\\u5011\\u003a(([0-9\\-]+))");
  62. //        s.setResultScript("([\\u51d8-\\u6c59]{1,2})\\s+([\\+\\-\\d]*)\\s+(\\d*(\\.\\d+)*)\\s+"); //([\\u5f35\\u51d8|\\u5791\\u5da1|\\u54a2\\u5606|(\\u0040\\u5311\\u0040)|\\u643b\\u6147|\\u68d6\\u6543|\\u6090\\u5a61|\\u6090\\u5a61|\\u6b2f\\u6c59|\\u0050\\u0048\\u0040\\u0040|\\u5be6\\u5da4|\\u69de\\u624f]{1,4})\\s+([\\+\\-\\d]*)\\s+(\\d*(\\.\\d+)*)\\s+
  63. //        scriptGroup.put("WJniao", s);

  64.         s = new Script();
  65.         s.setEquipmentName("ACL9000");
  66.         s.setRecondScript("(?:\\x02\\dH\\|.+[^.]*(\\x02\\d[POR]{1}\\|.*[^.]*)+(?:\\x02\\dL\\|\\d))+");  //(\\x02\\d[PO]{1}\\|.*([\\r\\n]{1,2}\\x03[A-Z\\d]{2}[\\r\\n]{1,2}))+(\\x02\\d[RC]{1}\\|.*([\\r\\n]{1,2}\\x03[A-Z\\d]{2}[\\r\\n]{1,2}))+
  67.         s.setSampleIDScript("\\x02\\dO\\|\\d\\|\\|((\\d+)).*\\|.+[^.]*\\x03");  //\\x02\\dO\\|\\d\\|((\\d+))\\|.+[\\n\\r]{1,2}\\x03
  68.         s.setResultScript("\\x02\\dR\\|(\\d*)\\|\\^*(\\d+).*\\|(\\d*(\\.\\d+))\\|.+[\\n\\r]{1,2}\\x03");
  69.         s.setItemCodePos(2);
  70.         s.setItemCodeAddPos(1);
  71.         s.setQuanValuePos(3);
  72.         scriptGroup.put("ACL9000", s);
  73.         
  74.         s = new Script();
  75.         s.setEquipmentName("920eo+");
  76.         s.setRecondScript("\\+{5}([\\s\\r\\nA-z\\=0-9\\-\\/\\:\\.]*)\\#{5}");
  77.         s.setSampleIDScript("SEQ=\\s+((\\d+))\\s+");
  78.         s.setResultScript("((?!SEQ)[A-z]{3,4})=\\s+(\\d+(\\.\\d+)*)\\s+");
  79.         scriptGroup.put("920eo+", s);
复制代码
我思考,我表达
#####  有事情找我的朋友,请加我QQ7106437,论坛的消息功能不太好用,我经常看不到站内消息。#####

TOP

很厉害啊

TOP

好厉害,java就是牛逼

TOP

楼主真是全才啊。
走在国产医疗设备的道路上。

TOP

下下来SEESEE

TOP

我在Visual Studio中用C# 判断仪器数据的完整性,想使用正则表达式

TOP

返回列表