# Comma-Separated Values(CSV) file (R)
## CSV introduction
- [Wiki 說明](https://zh.wikipedia.org/zh-tw/%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E5%80%BC): 說明很不錯(應是資工專家撰寫),內含不少專業說明,但實際應用時不一定會用到,可仔細看第一段概述,後續搭配應用實例,分析探討
- CSV 是一個結構簡單的文字檔(二維字串陣列,或稱資料表),廣泛應用於程式或系統間之交換,許多軟體(如 excel) 可匯出、匯入、及解析 CSV 檔。許多應用系統及資料庫也可輸出輸入 CSV 資料表
## Introduction of CSV format
- CSV file 通常為一個二維字串陣列,可看成行列二維字串表格,字串間通常以逗號(,)隔開,每列最後會有換行字元(ASCII CR/LF)
- 每列記錄通常有同樣數目的欄位
```csv
姓名,學號,作業1,作業2,作業3,期中考,期末考
張小美,S001,80,88,83,85,10
邱婷婷,S002,90,98,89,88,96
楊大名,S003,0,92,89,73,5
林志靈,S004,95,82,80,88,-1
```
以上範例是 CSV 檔在 hackmd 程式的結果,此範例可清楚了解:
- 可在 CSV 檔第一列定義各欄位名稱
- 上述範例每一列是一位同學的成績資料
- 每列資料包含姓名、學號、三次作業、期中考、期末考七欄資料,資料間以逗號隔開
- 每列資料結束會換行(註1)
註1: CSV 檔是一結構化資料檔,使用者通常只看到呈現的結果。但系統(如 excel, hackmd, 或自行開發的程式)要恰當解析及呈現 CSV 檔,必須了解 CSV 檔的格式,及具備程式讀取檔案及解析文字檔的能力
## 程式處理 CSV 檔需求
- 雖然許多應用軟體可處理 CSV 檔,但現行套件大多為通用軟體,功能眾多,但針對某資料處理時,常須不少設定及操作步驟。如上範例CSV 匯入 excel 需多個步驟才能算出同學學期總成績
- 另外,現行套件跨系統整合機制不佳。常造成操作不便及資料處理過程出錯。如上範例,在 excel 計算出總成績後,尚須在學校成績系統登入
- 若能自行撰寫程式,或可進一步將資料處理流程自動化,減輕使用者操控多套使用軟體的負擔,又可避免輸入或手動匯入匯出資料的錯誤
-- 例如老師可在學習平台提供作業及線上測驗,並輸入成績。學習平台可輸出定義清楚之結構化資料(如 CSV 檔),成績計算程式自動讀取 CSV 檔,老師在程式介面調整成績比例參數,程式自動計算總成績,並匯入學校成績紀錄系統(註1)`.
`
註: 上述資料規範、作業流程、資安需進一步考量。許多其他應用,也有類似需求待發展
## 程式處理 CSV 檔步驟概述
1. 讀取 CSV 檔
2. 解析資料中之逗號(,) 及換行(CR/LF),取得每個欄位(註 中文碼)
3. 指定程式變數紀錄取的欄位資料。因取得的欄位資料格式為字串,有時須資料型態轉換,才可存入變數。如範例中之成績資料, CSV 檔紀錄的是字串,須轉成整數或浮點數,程式才能計算
4. 基於需求,程式處理分析 CSV 檔。
5. 匯出或上傳資料。匯出的資料可為另一結構化文件(可為另CSV (或建議用 統計表格
- CSV 資料格式簡單,許多程式皆有處理範例。或可熟悉的程式語言及其簡單異動的範例,以利擴充修改
## CSV 檔種類
- 每一列是一筆資料(如上成績資料範例)
- 每一行是一筆序列資料,如心電圖、腦波、或動作紀錄,如下 ECG 節錄範例
```CSV
Lead II, V5
927,998
927,1017
1195,778
1214,792
1236,808
1266,830
1048,1111
1099,1131
1148,1140
1180,1119
1192,1066
921,1263
.....
```
註:
1. 上列資料第一行是 ECG(心電圖) Lead II,第一行 ECG Lead V2,兩個導程的資料。資料來源 [MIT ECG database](https://physionet.org/content/mitdb/1.0.0/),取樣頻率 360/秒,大約有 30 分鐘的資料,上述範例是節錄的結果
2. 上述範例是 ECG 訊號(電壓訊號,範圍 -5 mv 到 5mv(需確認) )經放大、類比轉數位(11 bit)的結果。11 bit 資料範圍 0 到 2047,資料中值 1024(0 mv)。 需再經轉換計算,才可還原成 mv,以利分析
3. 許多訊號如腦波、IMU 動作紀錄等,也可記錄成類似的時間序列
4. 上述範例的取樣頻率固定(360/s)。也有些訊號,並非固定時間取樣,產生的CSV 檔應有其取樣時間資訊
## CSV 檔不足之處
- 由於 CSV 結構簡單,易於解析,因此許多系統皆可輸出 CSV 檔。但此簡單結構的 CSV 檔在資料互通應用時,還有些不足:
1. 如上述兩個範例,CSV 檔當中並沒有個欄位之詳細說明。若要洽當處理系統輸出的資料,我們需要清楚記錄輸出檔案規格、處理需求。例如:
-- 程式看不懂中文(也開不懂英文),在上述成績範例,程式設計師因看得懂中文,曉得第一行是姓名、第二行學號、三到五行是作業、第六行期中考成績、第七行期末考成績。開發人員必須設定每一行資料代表的意義,才方便程式處裡
-- CSV 檔並無紀錄資料代表的意義及處理要求
--- 例如我們須再告訴總成績計算程式,作業、期中、期末成績在總成績所占的百分比,才能算出總成績。
--- 另外,範例中林志靈期末成績為 -1, -1 在成績紀錄代表的意義需額外說明(如 -1代表沒交作業或沒來考試)
-- 又如 ECG CSV 檔範例,其資料取樣頻率、數值範圍、紀錄數值與實際物理量之轉換資訊皆未紀錄
2. CSV 難以記錄樹狀結構的資料。如:
-- 一筆訂單,包含買家、賣家、訂貨時間、及多筆的商品及數量資訊。若 CSV 檔同一列表示一筆訂單,同一列當中要記錄多筆商品並不方便(因訂單中商品項目不固定)
-- 同樣地,我們可用 CSV 檔紀錄一個班級每位同學(一位同學一筆資料)的各科總成績。但在此 CSV 檔中,若要再紀錄每科小考、作業、期中、期末成績,則欄位將變得眾多,且各科考試作業數量不固定,不易在同一列中記錄
## CSV to FHIR
- 雖然 CSV 很常用,但它無法表現樹狀結構的資料,並且每個欄位沒有清楚定義。除非是大量的資料(註 1),系統若以清楚定義之 JSON 互通資訊(如 FHIR JSON),以利資料處理
- FHIR 定義的許多 resources ,每個 resource 中每個欄位的用途及資料型態皆有清楚定義。可配合許多應用情境(不限於健康醫療),明確規範資料輸出規格,以利跨系統整合應用
-- 如上 ECG 範例,可基於 FHIR observation resources,進一步規範 12 導程心電圖輸出之 observation 規範(註2),以此輸出 [FHIR 12 lead ECG](https://hl7.org/fhir//observation-example-sample-data.json.html)
-- 又如上述成績 CSV 檔範例,當中每位同學每個作業或考試的紀錄,皆可用一 FHIR obervation 紀錄
--- observation 可記錄受測者(subject)、給分老師(performer)、參考的作業及答題結果(derivedFrom)、所得分數( valueQuantity)或成績等第(valueCodeableConcept)
## CSV to FHIR 應用範例(註)
- 連續訊波形: ECG、腦波、IMU 動作紀錄等時間序列 CSV 檔
- 檢驗數據
-- 檢驗委外應用情境: 血液、尿液等檢驗結果常用 CSV 檔回傳給委檢單位
- 基因檢測
-- 變異點分析結果(VCF or CSV 檔)
註:上述範例皆是將 CSV 量測數據轉成 FHIR observation
## CSV to FHIR observation 概述
- 由於 CSV 檔內含的高度簡化,若要轉成 FHIR ,須先了解應用情境,以及 CSV 檔中每一行的詳細規格,以此決定:
1. 檢測前會先產生哪些 resources : 如 patient、encounter、serviceRequest 等
2. CSV 各欄位細部規格;如欄位數值意義、範圍、及代碼、轉換計算公式等
3. 要許用那些 observation 欄位及其 code System
4. 最後才是發展 CSV to FHIR 轉換程式。程式主要有下列處理步驟