我正在使用一种可以通过以下方式构造HL7消息的工具:
消息将以:0B开头
该段将以OD结尾
并且消息将以:1C0D结尾
因此,到目前为止,我已经可以在HL7消息的末尾添加OB并添加1C0D。我也可以在该段末之前添加OD。我正在用的代码完成,我将检查段名称之前的字符是否为0D。
但是问题是消息中的文本是否有点像这样... PID |我的代码将在PID前加0D |这是不正确的,应该检查其是否是该段的开始。
如果有人在类似的要求下工作,请提供帮助。
链接到我的代码是:
Arraylist Sublist IndexOutOfBounds Exception
最佳答案
我有一些时间来研究这个问题。据我了解,您有一些代码可以为您生成HL7v2段,然后您要使用以下定界符创建一条消息:
段分隔符:0x0D(或ASCII中的13),即回车符。它是段分隔符,根据HL7v2 standard;
消息开始定界符:0x0B(ASCII 11-垂直制表符);
消息完成定界符:0x1C0D。我的猜测是,该值应该是0x1C(ASCII 28-文件分隔符)和0x0D(ASCII 13-回车)的串联。
使用#1,您可以获得符合标准的HL7v2消息。使用#2和#3,您可以清楚地定义消息的分隔符,以便稍后可以由某些自定义处理器处理和解析该消息。
因此,我写了一些简单的代码,结果如下:
public class App
{
public static void main( String[] args ) throws Exception
{
String msg = "MSH|^~\\&|HIS|RIH|EKG|EKG|199904140038||ADT^A01||P|2.5" +
"PID|0001|00009874|00001122|A00977|SMITH^JOHN^M|MOM|19581119|F|NOTREAL^LINDA^M|C|564 SPRING ST^^NEEDHAM^MA^02494^US" +
"AL1||SEV|001^POLLEN";
String[] segments = msg.split("(?=PID|AL1)");
System.out.println("Initial message:");
for (String s : segments)
System.out.println(s);
byte hexStartMessage = 0x0B;
byte hexFinishMessage1 = 0x1C;
byte hexFinishMessage2 = 0x0D;
byte hexFinishSegment = 0x0D;
String finalMessage = Byte.toString(hexStartMessage) +
intersperse(segments, hexFinishSegment) +
Byte.toString(hexFinishMessage1) +
Byte.toString(hexFinishMessage2);
System.out.println("\nFinal message:\n" + finalMessage);
}
public static String intersperse(String[] segments, byte delimiter) throws UnsupportedEncodingException {
// uncomment this line if you wish to show the delimiter in the output
//System.out.printf("Byte Delimiter: %s", String.format("%04x", (int)delimiter));
StringBuilder sb = new StringBuilder();
String defaultDelimiter = "";
for (String segment : segments) {
sb.append(defaultDelimiter).append(segment);
defaultDelimiter = Byte.toString(delimiter);
}
return sb.toString();
}
}
我选择了一条简单的HL7v2消息,并根据消息中使用的段(名称)将其分成多个段,并借助regex with a lookahead strategy。这意味着,对于您的消息,您将需要知道将要使用的段(可以从标准中获取)。
然后,我将段分隔符散布在每个段之间(在其末尾),并添加了消息开始和结束定界符。在这种情况下,对于消息结尾定界符,我将0x1C和0x0D值分开使用,但是如果需要使用单个值,则只需要更改最后的追加即可。
这是输出:
Initial message:
MSH|^~\&|HIS|RIH|EKG|EKG|199904140038||ADT^A01||P|2.5
PID|0001|00009874|00001122|A00977|SMITH^JOHN^M|MOM|19581119|F|NOTREAL^LINDA^M|C|564 SPRING ST^^NEEDHAM^MA^02494^US
AL1||SEV|001^POLLEN
Final message:
11MSH|^~\&|HIS|RIH|EKG|EKG|199904140038||ADT^A01||P|2.5
PID|0001|00009874|00001122|A00977|SMITH^JOHN^M|MOM|19581119|F|NOTREAL^LINDA^M|C|564 SPRING ST^^NEEDHAM^MA^02494^US
AL1||SEV|001^POLLEN2813
如您所见,最后一条消息以值11(0x0B)开头,以28(0x1C)和13(0x0D)结尾。未显示每个段末尾的13(0x0D),因为Java的
System.out.println()
将其识别为'\r'
字符,并因为我在Mac OS X中运行而开始了新行。如果尝试散布这些段与任何其他字符(例如:0x25 ='%')一起使用,您会注意到最终消息以单行打印:11MSH|^~\&|HIS|RIH|EKG|EKG|199904140038||ADT^A01||P|2.5%PID|0001|00009874|00001122|A00977|SMITH^JOHN^M|MOM|19581119|F|NOTREAL^LINDA^M|C|564 SPRING ST^^NEEDHAM^MA^02494^US%AL1||SEV|001^POLLEN2813
如果我在Ubuntu上运行,您会看到与段定界符在同一行中的消息:
11MSH|^~\&|HIS|RIH|EKG|EKG|199904140038||ADT^A01||P|2.513PID|0001|00009874|00001122|A00977|SMITH^JOHN^M|MOM|19581119|F|NOTREAL^LINDA^M|C|564 SPRING ST^^NEEDHAM^MA^02494^US13AL1||SEV|001^POLLEN2813