![](/img/trans.png)
[英]HL7 Hapi get non-standard segment, segment's name present in standard segment
[英]How to find if HL7 Segment has ended or not if Carriage return is not present
我正在开发一种工具,它将按照以下方式构建 HL7 消息:
消息开始于:0B 段结束于:OD 消息结束于:1C0D
所以,到目前为止我已经达到了这里,我能够在 HL7 消息的末尾添加 OB 和添加 1C0D。 我还可以在段末尾之前添加 OD。 我正在完成代码,我将检查段名称之前的字符是否为 0D。
但问题是如果消息中的文本有点像这样...PID| 我的代码将在 PID| 之前添加 0D 这是不正确的,它应该检查它是否是段的开头。
如果有人处理过类似的要求,请提供帮助。
我有时间研究这个问题。 据我所知,您有一些代码可以为您生成 HL7v2 段,然后您想要创建一条包含以下分隔符的消息:
使用#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 消息,并根据消息中使用的段(名称),在带有前瞻策略的正则表达式的帮助下,将其分成段。 这意味着,对于您的消息,您需要知道将要使用的段(您可以从标准中获得)。
然后我在每个段之间(在其末尾)散布段定界符并添加消息开始和结束定界符。 在这种情况下,对于消息结束分隔符,我使用了 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.