我将一个对象传递给构造函数,然后将该对象的参数添加到HL7。 ORU_R01是HL7的类型。 当我将HL7打印到控制台时,仅打印最后一个OBX。 我的代码出了什么问题? 如何将此HL7消息写入套接字? 在java中有更简单的方法来处理handel 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 :(得分:1)
您是否考虑过使用HAPI?它是为java编写的,它的对应部分nHAPI也是为.net编写的。详情如下:
答案 1 :(得分:1)
正如Nicholas Orlowski指出的那样,问题在于行尾字符,根据HL7标准,CR字符使得Windows命令提示只将光标重置为行的开始并用下一行的内容覆盖它。因此,对于控制台输出您需要用其他内容替换行结尾。
对于最近使用HAPI的HL7应用程序,你似乎也在使用它,我做了一个小帮助方法来实现这个功能:
private static String replaceNewlines(String input) {
return input.replaceAll("\\r", "\n");
}
该函数可以在所有平台上使用,因为它将CR字符替换为特定于操作系统的换行符。
然后我可以用它输出到控制台,如下所示:
LOGGER.trace("Generated message contents:\n" + replaceNewlines(outMessage.encode()));
在这种情况下,我使用log4j登录到控制台,而不是简单的控制台打印输出,但问题对我来说是一样的。
希望它有所帮助!
答案 2 :(得分:0)
我的python HL7py库中遇到过类似的问题。很多时候控制台不喜欢打印字符。我不得不写一个帮助器,将CR更改为LF(换行)以正确显示行。希望有所帮助。
答案 3 :(得分:0)
它不会显示在控制台中,但会在您写入文件时显示。尝试在调试模式下查看变量并将其写入文件。