# 檔案或串流資料解析 ## 學習目標 - 使用工具(含 AI)及範例程式,解析常見的醫學數位內容 - 了解以下知識 1. ASCII code 2.(sign unsigned) char, short, int, float, array 3. 讀寫檔, 在資料解析之應用 ## 用途 - 基於特定資料結構,程式產生及解析資料 -- 幾乎所有須處理資料的應用都需要 ## 資料編碼存檔方式 - 文字檔(CSV, XML, JSON, FHIR JSON...) -- CSV 檔結構簡單,許多軟體支援匯入匯出,很常用,但無明確規格定義 -- XML, JSON 檔,可進一步清楚定義結構化文件。 IT 人員必須熟悉處理 XML, JSON 之程式與套件(C,JS, VS code) -- FHIR JSON 或 XML,基於國際標準,可有定義明確之欄位及編碼系統 -- 文字檔可用一般文字編輯軟體解析,亦於了解及處理,但以文字格式紀錄訊號或影像,資料量將倍增 - 數位檔 -- 內含許多不同資料型態的資料,如病人基本資料、就醫資料、波形資料 -- 病人及就醫資料可為文字型態(ASCII + 中文碼) -- 波形資料可能的資料型態:文字型態數值、數值資料:1,2,4 byte int, 2,4,8 byte 浮點數 -- 數值資料需判斷 sing 及 unsigned、 big endian little endian、資料有無壓縮等議題。對不熟之 IT 人員是大挑戰 -- 與程式當中處理變數及結構化物件不同,資料以 byte stream 方式存檔或交換。必須有明確的規格,方利於資料解析(但資工相關科系課程大多沒教)。格式範例: --- EBM 檔: tag length value 資料結構 --- DICOM 檔: tag、 length、value 或 tag、VR(資料型態)、length value 資料結構資料結構 --- MIT ECG: 檔案說明、標記、訊號資料分離 --- 建議的資料結構,描述資料與訊號資料分離,描述資料(FHIR documentReference),訊號 2 byte little endian unsigned int (資料匯出或傳輸互通頂層,無壓縮、無加密) ## 資料儲傳與資料處理說明 - 電腦以一個個 byte 儲存及傳輸資料 - 程式會定義字元、整數、浮點數等資料型態,以利運算及資料處理 - **程式讀取檔案或網路傳輸的資料後,須轉成對應的資料型態處理**。要儲存或傳輸資料前,程式將資料轉換成一個個 byte ,以利網路及檔案系統處理 ## 2. 程式變數之資料型態(以 C 為例) - char,unsigned char: 1 byte - short,unsigned short : 2 bytes - int,unsigned int: 4 bytes - float: 4 bytes - double: 8 bytes - [詳細的說明參考](https://learningmicro.wordpress.com/data-types-and-there-sizes-in-c/) - char and string 文字資料型態 -- ASCII (含英文、數字、及鍵盤輸入符號 及排版控制字元) -- 支援各國文字之編碼,如 UTF8 - 程式中還會基於上述資料型態組成常見的資料結構:陣列、字串、與物件(class),最後會將程式處理的結果存成資料檔(格式相當精采多樣) ### 檔案(或串流)與程式中變數資料轉換 - 程式變數存檔 - char, singn short... 資料存放到檔案,變成一個 byte 一個 byte 的檔案(串流)資料 - 讀檔將資料轉換成恰當的變數,**須提供範例程式及說明** ### 3. C read file example ```cpp unsigned char buffer[2000]; FILE * pFile; pFile = fopen ("d:\\img\\3.txt", "rb"); fread (buffer , sizeof(char), sizeof(buffer), pFile); fclose (pFile); int i; for(i=0; i< 2000;i++) { printf("index:%d, value: %03d, %02x, ASCII:%c\n",i, buffer[i], buffer[i],buffer[i]); } ``` 註 1. 不同的作業系統,相同名稱資料型態,資料長度可能不一樣,如 int 在不同作業系統,資料長度可為 2,4,8 bytes。[參考]( https://stackoverflow.com/questions/5401701/does-the-size-of-data-types-in-c-depend-on-the-os) 註 2. widows 及 linux, int 及浮點數 bytes 列排次序不同,程式從檔案或網路讀資料,轉換成變數須注意。 [Big-Endian 與 Little-Endian]( https://blog.gtwang.org/programming/difference-between-big-endian-and-little-endian-implementation-in-c/) 註 3. 其他程式語言也有訂立類似的資料型態, Java, C#, python, JavaScript ## C fwrite example ```cpp= char buffer[4]={'a','b',65,66}; FILE * pFile; pFile = fopen ("d:\\dataRet\\ret1.dat", "wb"); fwrite(buffer , sizeof(char), sizeof(buffer), pFile); int data = 3; fwrite(&data, sizeof(int), 1, pFile); fclose (pFile); printf("file write complete\n"); ``` ### more examples - 練習: 在程式當中設定 name(string), age(int), weight(float) 等變數,將你的資料寫入變數後,將資料存檔。 -- 繳交你存放的檔案 ## 參考連結 - [byte(8bit) 16 進制表示](https://zh.wikipedia.org/zh-tw/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6) - [ASCII](https://zh.wikipedia.org/wiki/ASCII) - [Base64 編碼](https://zh.wikipedia.org/zh-tw/Base64) ## 資料轉換處理需求 - 需轉換成固定規格的資料,以利資訊互通整合應用 -- 檔案或網路傳輸的資料,須有一致(標準)規格,以利裝置端、使用者端、伺服器端程式處理 -- 例如轉換成 XML、JSON 等結構化格式之文字檔案 ## 資料壓縮與加密 - 資料可能會先進行壓縮及加密,再進行交換 - 需基於常用(或標準)之壓縮及加密方式,以利兩端系統加密解密及壓縮解壓縮 ## 健康醫療應用情境 - 健康紀錄互通、物聯網、精準醫療(標準化醫學影像、數位病理、基因、影音資料分析與報告)、遠距醫療、醫病線上互動、 ## 1.解析混含型態結構化檔案(或串流)的挑戰 - A 程式產生的檔案,B 程式解讀常發生問題 -- 規格文件不清楚、難以看懂、對文件認知有差異、不知如何基於說明文件撰寫解析程式 -- 須了解基礎資料型態轉換 --- 如 big endian 與 little endian 互轉,bytes 轉 int or float,處理中文碼 - 通用物件之夢想 -- 工程師(不論資深或資淺) 常想設計通用之資料物件(害人害己) --- 如 DICOM part 5 定義的規格,可存放任何臨醫資料。影像、報告、波形(如 DICOM ECG)、影片、放腫定位資料(DICOM RT)... --- 但實際的軟體往往僅能處理部分 DICOM 物件。原因: ---- 須熟悉 DICOM Part 3 定義的所有物件,及熟 Part 5 DICOM 資料編碼(內含不少 options) ## 解決方式 - 文字資料以 JSON or XML 資料處理 - 數值資料以單一資料型態(int, float...)存檔或傳輸 - 壓縮之圖片或影片,僅支援少數幾種通用之壓縮規格