2011-11-24 3 views
1

개체를 생성자에 전달한 다음이 개체의 매개 변수를 HL7에 추가하고 있습니다. ORU_R01은 HL7의 유형입니다. 콘솔에 HL7을 인쇄 할 때 마지막 OBX 만 인쇄됩니다. 내 코드에 어떤 문제가 있습니까? 어떻게이 HL7 메시지를 소켓에 쓸 수 있습니까? 핸드 헬드 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

\ r을 \ n으로 바꿉니다. 실제로 수행하는 작업은 모든 세그먼트를 동일한 콘솔 행에 인쇄하는 것이므로 마지막 세그먼트를 볼 수 있지만 마지막 세그먼트가 이전 세그먼트보다 짧으면 마지막 세그먼트의 필드가 끝에 표시됩니다. 메시지를 파일에 쓰면 모든 세그먼트가 나타납니다. –

답변

1

당신은 HAPI를 사용하여 생각 해 봤나? 그것은 자바를 위해 작성된 것이고, 카운터 부분 인 nHAPI는 .net을 위해서도 작성되었습니다. 여기 세부 : 내 파이썬 HL7py 라이브러리에 비슷한 문제가 있었다

http://hl7api.sourceforge.net/

0

. 여러 번 콘솔은 인쇄 문자를 좋아하지 않습니다. CR을 LF (줄 바꿈)로 변경하여 줄을 올바르게 표시하는 도우미를 작성해야했습니다. 희망이 도움이됩니다.

0

콘솔에 표시되지 않지만 파일에 쓸 때 표시됩니다. 디버그 모드에서 변수를보고 파일에 쓰십시오.

1

Nicholas Orlowski가 지적했듯이 HL7 표준에 따라 Windows 명령 프롬프트가 커서를 행의 처음으로 재설정하고 다음 행의 행으로 덮어 쓰기 만하는 CR 문자 인 줄 끝 문자에 문제가 있음을 지적했습니다. 함유량. 그러므로 콘솔 출력 라인 엔딩을 다른 것으로 바꿔야합니다. 또한 사용하고있는 것으로 보인다 HAPI를 사용하여 최근 HL7의 앱

는,이 기능을 달성하기 위해 약간의 도우미 메서드를 만들어 :

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

은 대체로 기능은 모든 플랫폼에서 사용할 수 있습니다 CR 문자는 OS 고유의 개행 문자로 처리됩니다. 내가하지 간단한 콘솔 출력을 콘솔에 로그인하기위한 log4j를 사용하고이 경우

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

을하지만, 문제는 나를 위해 동일 :

그럼 다음과 같이 콘솔에 출력에 사용할 수 있습니다.

희망 하시겠습니까?