gpt4 book ai didi

java - 如果不存在回车符,如何确定 HL7 段是否已结束

转载 作者:行者123 更新时间:2023-12-01 10:34:48 24 4
gpt4 key购买 nike

我正在开发一个工具,它将通过以下方式构建 HL7 消息:

消息将以:0B 开头段将以 : OD 结尾消息将以:1C0D 结束

所以,到目前为止,我已经能够添加 OB 并在 HL7 消息的末尾添加 1C0D。我还可以在段末尾添加 OD。我正在使用代码完成,我将检查段名称之前的字符是否为 0D。

但问题是消息中的文本是否有点像这样...PID|我的代码将在 PID| 之前添加 0D这是不正确的,它应该检查它是否是段的开始。

如果有人做过类似的要求,请提供帮助。

我的代码的链接是: Arraylist Sublist IndexOutOfBounds Exception

最佳答案

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

  1. 段分隔符:0x0D(或 ASCII 中的 13),即回车符。它是段分隔符,如 HL7v2 standard ;
  2. 消息开始分隔符:0x0B(ASCII 11 - 垂直制表符);
  3. 消息结束分隔符: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

关于java - 如果不存在回车符,如何确定 HL7 段是否已结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com