2011-11-24 206 views
1

我将一个对象传递给构造函数,然后将该对象的参数添加到HL7。 ORU_R01是HL7的类型。 当我打印HL7控制台时,只打印最后一个OBX。 我的代码有什么问题? 我该如何写这个HL7消息到套接字? 有没有更简单的方法在java中handel HL7?在控制台中打印HL7消息

public class FlexSMessageHL7 { 
private FileWriter writeHL7ToFile; 
private PrismaflexSMessage sMessage; 
private ORU_R01 message; 
private int i = 0; 
private OBX obx = null; 

public FlexSMessageHL7(FlexSMessage sMessage) { 
    this.sMessage = sMessage; 
    this.message = new ORU_R01(); 
    createHL7SMessage(); 
} 

public void createHL7SMessage() { 

    // Populate the MSH Segment 
    MSH msh = message.getMSH(); 
    try { 
     msh.getFieldSeparator().setValue("|"); 
     msh.getEncodingCharacters().setValue("^~\\&"); 
     msh.getDateTimeOfMessage().setValue(sMessage.getTime().toString()); 
     msh.getSendingApplication().getNamespaceID().setValue(String.valueOf(sMessage.getMachID())); 
    } catch (DataTypeException e) { 
     e.printStackTrace(); 
    } 

    // Populate the OBR Segment:time 
    OBR obr = message.getPATIENT_RESULT().getORDER_OBSERVATION().getOBR(); 
    try { 
     obr.getObservationDateTime().setValue(String.valueOf(sMessage.getTime())); 
    } catch (DataTypeException e) { 
     e.printStackTrace(); 
    } 

    // Populate the PID Segment:PatientId 
    PID pid = message.getPATIENT_RESULT().getPATIENT().getPID(); 
    try { 
     pid.getPatientID().getIDNumber().setValue(sMessage.getPatID()); 
    } catch (HL7Exception e) { 
     e.printStackTrace(); 
    } 

    // Populate the OBX Segment:Param_Code, time, Measure_Value 
    while (i < sMessage.getMsgInfo()) { 
     for (PrismaflexSRecord sRecord : sMessage.getsRecordCollection()) { 
      try { 
       obx = message.getPATIENT_RESULT().getORDER_OBSERVATION().getOBSERVATION(i).getOBX(); 
       obx.getSetIDOBX().setValue(String.valueOf(i)); 
       obx.getObservationIdentifier().getIdentifier().setValue(sRecord.getParamCode()); 
       obx.getDateTimeOfTheObservation().setValue(String.valueOf(sRecord.getTimeStamp())); 
       obx.getObservationIdentifier().getNameOfCodingSystem().setValue(String.valueOf(sRecord.getMeasureValue())); 
       i++; 
      } catch (HL7Exception e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
    try { 
     writeHL7ToFile = new FileWriter(File.createTempFile("prismaflexOutputFrom3001HL7", "txt", new File 
       ("c:\\tmp\\prismaflex"))); 
     writeHL7ToFile.write(message.getMSH().toString()); 
     writeHL7ToFile.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    // Now, Encode the message and look at the output 
    try { 

     Parser parser = new PipeParser(); 
     String encodedMessage = parser.encode(message); 
     System.out.println("Printing HL7 Encoded Message:"); 
     System.out.println(encodedMessage); 
    } catch (HL7Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

+0

用\ n替换\ r。它实际上是在同一个控制台行中打印所有的段,所以你会看到最后一个段,但是如果最后一个段比前一个段短,你会看到最后一个段的字段。尝试将消息写入文件,您会看到所有的细分。 –

回答

0

我曾在我的Python HL7py库类似的问题。很多时候,控制台不喜欢打印字符。我不得不写一个帮助器,将CR更改为LF(换行符)以正确显示行。希望有所帮助。

0

它不会显示在控制台中,但会在写入文件时显示。尝试在调试模式下查看变量并将其写入文件。

1

作为尼古拉斯ORLOWSKI指出的那样,问题是在结束字符线,根据HL7标准,该标准是CR字符,使一个Windows命令提示仅光标复位到该行的beggining并与下一行的覆盖它内容。因此,对于控制台输出您需要将行结束替换为其他内容。

对于使用高致病性禽流感,这也似乎使用的是最新HL7的应用程序,我做了一个小帮手的方法来实现这个功能:

private static String replaceNewlines(String input) { 
    return input.replaceAll("\\r", "\n"); 
} 

该功能可以在所有平台上使用,因为它取代具有特定于操作系统的换行符的CR字符。

然后,我可以用它来输出到控制台如下:

LOGGER.trace("Generated message contents:\n" + replaceNewlines(outMessage.encode())); 

在这种情况下,我使用log4j来进行登录到控制台,而不是简单的控制台打印输出,但问题是我也一样。

希望它有帮助!