2014年12月21日 星期日

HL7 v2.6學習心得 第二章 Message Framework ─ 3

原文參考2.5.4 Message delimiters
==============================
話說上回聊到有欄位分隔符號與重複分隔符號後,那你一定會問「還有哪些分隔符號?」是地,還有一些分隔符號需要學習的。而且,對於實作HL7訊息者,這個是非常重要的資訊。因為你就是透過這幾個字元來辨識程式的邏輯。
在HL7 v2.x版中其實有分成XML版與ER7版。若你走的XML版本,那這些分隔符號其實你可以不用理他,你要遵守的是XML的剖析規則。但是,你要走的是ER7格式(就是傳統格式),這些分隔符號就顯得非常重要。因為我們有可能需要將XML格式轉成ER7的格式,所以,這部分還是要學習一下。因為,你無法保證你的接收端都懂得接收XML格式的檔案。
接著就來看,有哪些分隔符號。其實不多,只有六種。
1. Segment Terminator 區段結束符號

    其實一個HL7訊息,基本上是一個大字串,把這個大字串存成一個檔案,然後送給接收者(當然是以電子方式囉,不是印出來寄過去)。之前也聊過,一個訊息是由很多的區段所組成,每個區段都用三個大寫的英文字母來代表,如MSH、PID等。這時候要再多加一條規則,就是每一個區段結束後,請再多加一個carriage return。在ASCII編碼中十進制是13,十六進制是0D。注意,他是屬於控制字元,不是顯示字元,在電腦畫面上不會佔一格,你是看不見的。若要以顯示字元表達時,習慣是用<CR>。講到這,不得不強調一下。各位在電腦畫面上都是看到每一個新的區段,其字母都會整整齊齊在新的一行左邊出現。各位,這是加工後的結果。為了顯示好看,又加上了<LF>的結果。注意唷,不要copy&paste,就當作訊息送出去。好一點的設計,會把訊息這個大字串,分成顯示還是傳送用。
注意,這個結束符號是不得改變的唷。
2. Field Separator 欄位分隔符號

    除了前面這個區段結束符號不得改變之外,從現在開始所講的分隔符號都是可以自訂的。當然,HL7標準是有些建議值,這就是之前說過的"|"。
可以自訂?發送端搞個自訂,那接收端怎麼知道呢?簡單呀,這些自訂的分隔符號字元,就直接擺在訊息裡,讓接收端的程式自己去想辦法囉。所以,這個資料一定要放在訊息的最開頭。訊息又是由區段組成,所以,訊息的前三個字是MSH這個區段名稱,然後是分隔符號,然後就是其他的分隔符號(先忍耐,後續就會個別講到)。假設都是用預設的話,那訊息的一開頭就為長成這樣子:
MSH|^~\&|
若是你想改用"*"做欄位分隔符號,其他不變,那你的訊息開頭就會變成:
MSH*^~\&*
你改成這樣子,你就必須要保證,欄位內容值絕對不會出現"*",否則一切都毀了。
所以盡量採預設值,如果你的欄位內容值就是含有"|的話,那還是有其他的變通管道。那就跳脫符號"\",這個留到第6點來說明。
3. Repetition Separator 重複分隔符號

這個符號在之前就講過囉,預設是用"~"。
4. Component Separator 組件分隔符號

之前有講過,每個欄位都會有資料型態,而這個資料型態是屬於reference type。也就是說,這個資料型態也可能包含有數個欄位內容。好像是一個組件的感覺。我們用PID這個區段來解釋。

別的不管,先看第5個欄位 Patient Name。看英文名稱應該知道是用來代表病患姓名。再來看他得資料型態,很抱歉,他不是字串,而是一個叫XPN的資料型態。那我們來找找,XPN長什麼樣子。注意,從v2.5之後,資料型態就獨立成一份文件CH02A Data Types。


原來XPN還這麼複雜唷。這個資料表示描述資料型態,基本上跟欄位資料表示類似,好像也是一個一個的欄位呀。既然欄位要分隔,這個也是要分隔呀。可是,若用了與欄位相同分隔符號的話,就會天下大亂了,只好找個新的符號。HL7的預設符號是"^"。這時候,你看到下列訊息時,應該不會覺得很刺眼了吧。
PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTH
HOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M||C|2222 HOME
STREET^^GREENSBORO^NC^27401-1020|GL|(555) 555-2004|(555)555-2004||S||
仔細算欄位分隔符號"|'的第5個空間(哈~眼瞎了我不負責。這是給電腦看的啦),是不是EVERYMAN^ADAM^A^ 。如果不是,請保重,相信我就好。再用"^"組件分隔符號對照到XPM的順序,我說Give Name是ADAM,這下子你同意了吧。拜託,訊息交換不是這樣子搞的啦。我常說,這嚨是電腦徑的啦。講到這,你都懂,你的功力也大增了。
5. Subcomponent Separator 次組件分隔符號

講到組件分隔符號時,看到了XPN資料型態的欄位表。他也有一個欄位叫DT,也就是資料型態。很煩吧,「資料型態的資料型態還是資料型態」。所以,也會面臨欄位區隔的問題。這時候,HL7的預設分隔符號是"&"。
那還不會不有下一層呢,感謝唷!沒有了。
6. Escape Character 跳脫符號

這跳脫符號的用法跟其他程式語言所定義的是一樣的。預設的跳脫符號是"\"。真的要詳細講跳脫符號的話,得另闢專章了。
這時候該來談談那個這些符號的順序性了。在第2點欄位分隔符號時,有提到MSH這個區段,他就是用來描述整個訊息的基本資料。這條區段是特別給HL7訊息剖析程式看的。程式收到訊息的第一件事情就是確認字串開頭是不是MSH,不是,什麼都不用做了。看到MSH,放心了,在看下一個字元,喔這就是分隔符號了。確認了這個分隔符號後,就是在去找下一個跟這個一樣的字元,然後這兩個分隔符號內的東西,就是這個訊息會用到的分隔符號(這些是訊息建構規則)。依序是:
  1. ^ 組件分隔符號。
  2. ~ 重複分隔符號。
  3. \ 跳脫符號。
  4. & 次組件分隔符號。
=============================

這邊留下了好多伏筆。資料型態、跳脫符號、訊息建構規則等。哈~只能慢慢等我的學習心得。注意,我可沒有免費教你們唷。我只是把我學習過程分享出來而已。

沒有留言:

張貼留言