如果 Carriage return 不存在,如何查找 HL7 段是否结束

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这是不正确的,它应该检查它是否是段的开头。

如果有人处理过类似的需求,请帮忙。

Link 我的代码是:

我有时间研究这个问题。据我所知,您有一些代码可以为您生成 HL7v2 段,然后您想要创建一条包含以下分隔符的消息:

  1. 段分隔符:0x0D(或ASCII中的13),即回车符Return。这是段分隔符,根据 HL7v2 standard;
  2. 消息开始分隔符:0x0B(ASCII 11 - 垂直制表符);
  3. 消息结束分隔符:0x1C0D。我的猜测是这个值应该是 0x1C(ASCII 28 - 文件分隔符)和 0x0D(ASCII 13 - Carriage Return)的串联。

对于 #1,您会收到 HL7v2 消息 standard-compliant。使用#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' 字符并开始新行,因为我是 运行ning in 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