iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0
自我挑戰組

Medical Data Cleaner系列 第 18 篇

實作清理後 CSV 匯出功能

  • 分享至 

  • xImage
  •  

前幾天已經陸續完成資料品質檢查、缺失值處理、格式標準化、重複資料移除與數值異常處理。
不過,如果清理後的資料只能顯示在網頁上,使用者仍然無法直接將資料拿去做後續分析。
因此今天加入 CSV 匯出功能,讓使用者可以將清理後的資料下載到電腦,方便使用 Excel 或其他資料分析工具繼續處理。
一、建立export.php
首先,在專案資料夾中新增 export.php。
這個檔案負責讀取測試資料、套用清理規則,再將處理完成的資料輸出成 CSV 檔案。
二、讀取原始資料
首先指定要處理的CSV檔案:

$file = 'medical_data_test.csv';

if (!file_exists($file)) {
    exit('找不到測試資料檔案。');
}

if (($handle = fopen($file, 'r')) === false) {
    exit('無法讀取測試資料檔案。');
}
$header = fgetcsv($handle, 0, ',', '"', '');

這裡使用file_exists()確認檔案是否存在,再使用fopen()開啟檔案。
第一列是欄位名稱,因此另外存放在$header中,匯出時才能保留原本的欄位名稱。
三、套用資料清理規則
讀取每一筆資料時,先複製原始資料:

$cleanedRow = $row;

接著套用先前建立的清理規則。

  1. 處理缺失值
if (trim($row[2]) === '') {
    $cleanedRow[2] = 'Unknown';
}

如果 gender 是空白,就將清理後的值改成 Unknown。
2. 標準化性別格式

if ($row[2] === '男性' || $row[2] === 'M') {
    $cleanedRow[2] = '男';
}

將不一致的性別表示方式統一為 男。
3. 標準化日期

if (preg_match('/^\d{4}\/\d{2}\/\d{2}$/', $row[8])) {
    $cleanedRow[8] = str_replace('/', '-', $row[8]);
}

將使用斜線的日期格式轉換為使用連字號的格式,例如 2026/09/05 轉換為 2026-09-05。
4. 處理異常數值

    ($row[1] < 0 || $row[1] > 120)) {
    $cleanedRow[1] = 'Unknown';
}
if (is_numeric($row[6]) &&
    ($row[6] < 30 || $row[6] > 200)) {
    $cleanedRow[6] = 'Unknown';
}

如果年齡或心率超出本專案設定的測試範圍,就將對應欄位標記為 Unknown。
這些範圍是用來測試資料品質的規則,並不是醫療診斷標準。
四、移除重複資料
為了避免匯出的資料仍然包含重複項目,使用陣列記錄已經處理過的原始資料。

$signature = implode('|', $row);
if (isset($seenRows[$signature])) {
    continue;
}
$seenRows[$signature] = true;
$rows[] = $cleanedRow;

這裡使 continue跳過後續完全相同的資料,只保留第一筆。
需要注意的是,目前的判斷方式是比對整筆資料是否完全相同,並不是依照病人編號刪除所有重複紀錄。
五、輸出 CSV 檔案
完成清理後,就可以將資料輸出成新的CSV檔案。

header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="cleaned_medical_data.csv"');
$output = fopen('php://output', 'w');
fwrite($output, "\xEF\xBB\xBF");
fputcsv($output, $header);
foreach ($rows as $row) {
    fputcsv($output, $row);
}
fclose($output);
exit;

這段程式有幾個重要功能:
Content-Type:告訴瀏覽器輸出的是 CSV。
Content-Disposition:讓瀏覽器以下載檔案的方式處理回應。
php://output:將資料直接輸出給瀏覽器,不需要先建立暫存檔。
fputcsv():將欄位正確寫成 CSV 格式。
UTF-8 BOM:協助部分試算表軟體正確顯示中文。
下載的檔案名稱為 cleaned_medical_data.csv。
六、加入網頁下載連結
接著回到 index.php,加入下載連結:

echo '<h3>匯出清理後資料</h3>';
echo '<a href="export.php">下載清理後 CSV</a>';

這樣使用者就可以直接從網頁點擊連結,下載清理後的資料。
七、今天成果
目前的流程已經包含:
讀取 CSV->檢查資料品質->處理資料問題->記錄變更->預覽清理後資料->下載清理後 CSV


上一篇
建立清理前後的變更紀錄
下一篇
建立醫療資料清理工具的網頁介面
系列文
Medical Data Cleaner 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言