[英]HL7 message parsing error using java socket and HAPI
I am working with a Auto Hematology analyzer which generate HL7 Message and send via TCP/IP to a connected PC. 我正在使用自动血液学分析仪生成HL7消息并通过TCP / IP发送到连接的PC。 I am using java socket to receive the HL7 message/data.
我正在使用java socket来接收HL7消息/数据。 but when I trying to parsing the HL7 message (string) it showing an error message:
但是当我尝试解析HL7消息(字符串)时,它显示一条错误消息:
ca.uhn.hl7v2.parser.EncodingNotSupportedException: Determine encoding for message.
ca.uhn.hl7v2.parser.EncodingNotSupportedException:确定消息的编码。
The following is the first 50 chars of the message for reference, although this may not be where the issue is: 以下是该消息的前50个字符供参考,尽管这可能不是问题所在:
.MSH|^~\&|DH3x|Dymind|||20190421171520||ORU^R01|20`
I am trying to parsing the message using HAPI 我正在尝试使用HAPI解析消息
public static void main(String[] args) {
try {
//When using file
//String messageString = readHL7MessageFromFileAsString(filePath);
String messageString = ".MSH|^~\\&|DH3x|Dymind|||20190421171520||ORU^R01|20190421_140443_220|P|2.3.1||||||UNICODE\r\n" +
"PID|1\r\n" +
"PV1|1\r\n" +
"OBR|1||275|01001^Automated Count^99MRC||20190421140443|20190421140443|||||||20190421140443||||||||||HM||||||||admin\r\n" +
"OBX|1|IS|02001^Take Mode^99MRC||O||||||F\r\n" +
"OBX|2|IS|02002^Blood Mode^99MRC||W||||||F\r\n" +
"OBX|3|IS|02003^Test Mode^99MRC||||||||F\r\n" +
"OBX|4|NM|30525-0^Age^LN||||||||F\r\n" +
"OBX|5|IS|09001^Remark^99MRC||||||||F\r\n" +
"OBX|6|IS|03001^Ref Group^99MRC||||||||F\r\n" +
"OBX|7|NM|6690-2^WBC^LN||7.94|10*3/uL|4.00-10.00|~N|||F\r\n" +
"OBX|8|NM|736-9^LYM%^LN||34.4|%|20.0-40.0|~N|||F\r\n" +
"OBX|9|NM|20482-6^GRAN%^LN||52.5|%|50.0-70.0|~N|||F\r\n" +
"OBX|10|NM|32155-4^MID%^LN||13.1|%|3.0-9.0|H~A|||F\r\n" +
"OBX|11|NM|731-0^LYM#^LN||2.73|10*3/uL|0.80-4.00|~N|||F\r\n" +
"OBX|12|NM|19023-1^GRAN#^LN||4.17|10*3/uL|2.00-7.00|~N|||F\r\n" +
"OBX|13|NM|32154-7^MID#^LN||1.04|10*3/uL|0.10-0.90|H~A|||F\r\n" +
"OBX|14|NM|789-8^RBC^LN||4.71|10*6/uL|3.50-5.50|~N|||F\r\n" +
"OBX|15|NM|718-7^HGB^LN||13.7|g/dL|11.0-16.0|~N|||F\r\n" +
"OBX|16|NM|4544-3^HCT^LN||40.7|%|37.0-50.0|~N|||F\r\n" +
"OBX|17|NM|787-2^MCV^LN||86.4|fL|82.0-95.0|~N|||F\r\n" +
"OBX|18|NM|785-6^MCH^LN||29.2|pg|27.0-31.0|~N|||F\r\n" +
"OBX|19|NM|786-4^MCHC^LN||33.8|g/dL|32.0-36.0|~N|||F\r\n" +
"OBX|20|NM|788-0^RDW-CV^LN||13.5|%|11.5-14.5|~N|||F\r\n" +
"OBX|21|NM|21000-5^RDW-SD^LN||47.1|fL|35.0-56.0|~N|||F\r\n" +
"OBX|22|NM|777-3^PLT^LN||255|10*3/uL|100-300|~N|||F\r\n" +
"OBX|23|NM|32623-1^MPV^LN||9.9|fL|7.0-11.0|~N|||F\r\n" +
"OBX|24|NM|32207-3^PDW^LN||16.1||15.0-17.0|~N|||F\r\n" +
"OBX|25|NM|11003^PCT^99MRC||0.251|%|0.108-0.282|~N|||F\r\n" +
"OBX|26|NM|12001^WBC Histogram. Left Line^99MRC||15||||||F\r\n" +
"OBX|27|NM|12004^WBC Histogram. Middle Line^99MRC||43||||||F\r\n" +
"OBX|28|NM|12002^WBC Histogram. Right Line^99MRC||66||||||F\r\n" +
"OBX|29|ED|12003^WBC Histogram. BMP^99MRC||^Image^PNG^Base64^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||||||F\r\n" +
"OBX|30|NM|12051^RBC Histogram. Left Line^99MRC||28||||||F\r\n" +
"OBX|31|NM|12052^RBC Histogram. Right Line^99MRC||230||||||F\r\n" +
"OBX|32|ED|12053^RBC Histogram. BMP^99MRC||^Image^PNG^Base64^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||||||F\r\n" +
"OBX|33|NM|12101^PLT Histogram. Left Line^99MRC||5||||||F\r\n" +
"OBX|34|NM|12102^PLT Histogram. Right Line^99MRC||56||||||F\r\n" +
"OBX|35|ED|12103^PLT Histogram. BMP^99MRC||^Image^PNG^Base64^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||||||F\r\n" +
".\r\n" +
".MSH|^~\\&|DH3x|Dymind|||20190421171520||ACK^R01|20190421_140443_220|P|2.3.1||||||UNICODE\r\n" +
"MSA|AA|20190421_140443_220\r\n" +
".\r\n" +
"";
// instantiate a PipeParser, which handles the "traditional or default encoding"
PipeParser ourPipeParser = new PipeParser();
// parse the message string into a Java message object
Message orderResultsHl7Message = ourPipeParser.parse(messageString);
// create a terser object instance by wrapping it around the message object
Terser terser = new Terser(orderResultsHl7Message);
// now, let us do various operations on the message
TerserHelper teFrserDemonstrator = new TerserHelper(terser);
String terserExpression = "/.OBSERVATION(1)/OBX-3";
String dataRetrieved = teFrserDemonstrator.getData(terserExpression);
System.out.printf("Observation group's 2nd OBX segment's second field using expression '%s' was: '%s' \n\n",
terserExpression, dataRetrieved);
terserExpression = "/.OBSERVATION(1)/NTE(1)-3";
dataRetrieved = teFrserDemonstrator.getData(terserExpression);
System.out.printf("Observation group's 2nd NTE segment's second field using expression '%s' was: '%s' \n\n",
terserExpression, dataRetrieved);
terserExpression = "/.RESPONSE/ORDER_OBSERVATION/OBSERVATION(0)/OBX(0)-16-2";
dataRetrieved = teFrserDemonstrator.getData(terserExpression);
System.out.printf(
"Observation group's First OBX segment's 16th Field and its Second component using expression '%s' was: '%s' \n\n",
terserExpression, dataRetrieved);
// let us now try a set operation using the terser
terserExpression = "/.OBSERVATION(1)/NTE-3";
teFrserDemonstrator.setData(terserExpression, "This is our override value using the setter");
System.out.printf("Setting the data for second repetition of the NTE segment and its third field\n",
terserExpression, dataRetrieved);
System.out.println("\nWill display our modified message below \n");
System.out.println(ourPipeParser.encode(orderResultsHl7Message));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String readHL7MessageFromFileAsString(String fileName) throws Exception {
return new String(Files.readAllBytes(Paths.get(fileName)));
}
I expect Message object. 我期待Message对象。 but the output give me an error message:
但输出给我一个错误信息:
ca.uhn.hl7v2.parser.EncodingNotSupportedException: Determine encoding for message.
ca.uhn.hl7v2.parser.EncodingNotSupportedException:确定消息的编码。
The following is the first 50 chars of the message for reference, although this may not be where the issue is: 以下是该消息的前50个字符供参考,尽管这可能不是问题所在:
.MSH|^~\&|DH3x|Dymind|||20190421171520||ORU^R01|20
I think this is because of the leading and trailing dots in your message string. 我认为这是因为消息字符串中的前导和尾随点。 Also you have an ORU^R01 and it's response in the same message string.
你也有一个ORU ^ R01,它在同一个消息字符串中的响应。 This combined with the dots probably leads to the parsing error.
这与点结合可能会导致解析错误。
You may want to explicitly call msh.getEncodingCharacters()
and check it's return value (or inspect the exceptions stacktrace) 您可能希望显式调用
msh.getEncodingCharacters()
并检查它的返回值(或检查异常stacktrace)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.