# 檔案或串流資料解析
## 學習目標
- 使用工具(含 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...)存檔或傳輸
- 壓縮之圖片或影片,僅支援少數幾種通用之壓縮規格