前幾天完成資料品質檢查後,系統已經可以找出資料中的缺失值、格式錯誤、數值異常、重複資料以及一致性問題。
不過目前的功能主要都是「找出問題」,如果真的要做成一個資料清理工具,還需要進一步處理這些問題。
所以今天先從最基本的缺失值開始,讓系統在發現空白資料後,不只是顯示問題,也可以建立一份清理後的資料。
一、先找出缺失值
目前測試資料中P002的gender是空白的
在原本缺失職檢查程式執行後會看到:
【缺失值】P002 → gender → 建議處理:補上資料或標記為 Unknown
這樣就可以知道是哪一位病人的哪一個欄位缺少資料。
二、建立清理後資料
如果直接修改原本的$row,之後可能會不容易比較原始資料和清理後資料,因此另外建立$cleanedRows,用來存放清理後的資料。
$cleanedRows = [];
讀取每一筆資料時再建立一個$cleanedRow:
while (($row = fgetcsv($handle, 0, ',', '"', '')) !== false) {
$cleanedRow = $row;
$totalRows++;
這樣$row可以保留原始資料,而$cleanedRow則可以用來進行清理。
三、處理缺失的gender
這次的測試資料中,缺失的是gender,因此先針對這個欄位進行處理。
如果發現欄位是空白,就把清理後的資料設定為Unknown:
if ($header[$index] === 'gender') {
$cleanedRow[$index] = 'Unknown';
}
完整的缺失值處理變成:
foreach ($row as $index => $value) {
if (trim($value) === '') {
$missingCount++;
$affectedPatients[$row[0]] = true;
echo '【缺失值】' . $row[0] . ' → '
. $header[$index]
. ' → 建議處理:補上資料或標記為 Unknown<br>';
if ($header[$index] === 'gender') {
$cleanedRow[$index] = 'Unknown';
}
}
}
這裡沒有直接修改原本的 CSV,而是修改 $cleanedRow。
這樣可以保留原始資料,也方便之後進行「清理前」和「清理後」的比較。
四、儲存每一筆清理後的資料
完成一筆資料的檢查與處理後,把清理後的資料加入$cleanedRows:
$cleanedRows[] = $cleanedRow;
因此最後$cleanedRows裡面就會存放整份清理後的資料。
五、顯示清理後資料
接著在讀取完CSV後,加入清理後資料的預覽:
echo '<hr>';
echo '<h3>清理後資料預覽</h3>';
echo '<table border="1" cellpadding="5">';
echo '<tr>';
foreach ($header as $column) {
echo '<th>' . $column . '</th>';
}
echo '</tr>';
foreach ($cleanedRows as $cleanedRow) {
echo '<tr>';
foreach ($cleanedRow as $value) {
echo '<td>' . $value . '</td>';
}
echo '</tr>';
}
echo '</table>';
這樣網頁上除了原本的資料品質檢查結果之外,下面還會多出一個「清理後資料預覽」。
六、執行結果
原本 P002 的資料是:
P002 | 25 | [空白] | 165 | 52 | 115/75 | 82 | 外科 | 2026-09-01
清理後的資料則變成:
P002 | 25 | Unknown | 165 | 52 | 115/75 | 82 | 外科 | 2026-09-01
其他沒有缺失值的資料則維持原本的內容。