Nếu bạn đang phát triển một ứng dụng Node.js xử lý các file tải lên như CSV hoặc Excel, chắc chắn bạn đã từng gặp phải những dữ liệu lộn xộn. Dưới đây là cách tôi xử lý những vấn đề như tiêu đề sai, định dạng ngày tháng kỳ lạ, và dữ liệu trùng lặp — tất cả chỉ dùng JavaScript thuần.
Vì sao các File lộn xộn là cơn ác mộng âm thầm đối với lập trình viên
Tải file lên thì dễ.
Xử lý chúng đúng cách? Không dễ chút nào.
Khi bạn làm việc với bảng tính do người dùng gửi lên hoặc dữ liệu lấy từ nguồn bên ngoài, các định dạng lộn xộn có thể nhanh chóng phá hỏng logic của bạn:
"Name"
vs"name"
vs"Full Name"
trong tiêu đề- Các dòng chứa giá trị rỗng hoặc
null
- Định dạng ngày tháng không nhất quán (
MM/DD/YYYY
,DD-MM-YYYY
,2024/05/25
) - Dữ liệu trùng lặp vượt qua kiểm tra mà không báo lỗi
- Khoảng trắng thừa, mã hóa kỳ lạ, vấn đề BOM (Byte Order Mark)
Nếu bạn từng ngồi hàng giờ dò từng dòng dữ liệu với vô vàn tình huống ngoài dự đoán — bạn không cô đơn đâu.
Hướng dẫn từng bước làm sạch File dữ liệu trong Node.js
Đây là cách tôi xử lý các file CSV lộn xộn trong Node.js, không cần chuyển ngôn ngữ hay cài đặt cả một hệ thống khoa học dữ liệu.
Bạn sẽ học cách:
- Phân tích (parse) file CSV
- Chuẩn hóa tiêu đề
- Loại bỏ giá trị rỗng / null
- Chuẩn hóa định dạng ngày tháng
- Loại bỏ dữ liệu trùng lặp
- Tổng hợp tất cả thành một tiện ích có thể tái sử dụng
1. Phân tích File CSV trong Node.js
const fs = require('fs');
const csv = require('csv-parser'); function parseCSV(path) { return new Promise((resolve, reject) => { const rows = []; fs.createReadStream(path) .pipe(csv()) .on('data', (row) => rows.push(row)) .on('end', () => resolve(rows)) .on('error', reject); });
}
Hàm này sẽ đọc file và trả về dữ liệu dưới dạng mảng các object trong JavaScript.
2. Chuẩn hóa tiêu đề cột
Tiêu đề sai định dạng có thể phá vỡ toàn bộ logic. Hãy chuẩn hóa từ sớm:
function normalizeHeaders(row) { const cleanRow = {}; for (const key in row) { const newKey = key.trim().toLowerCase().replace(/\s+/g, '_'); cleanRow[newKey] = row[key].trim(); } return cleanRow;
}
Ví dụ: "Full Name"
→ full_name
, " age "
→ age
.
3. Xóa các trường Null hoặc Rỗng
function cleanRow(row) { const cleaned = {}; for (const key in row) { const val = row[key]; if (val !== null && val !== '' && val !== undefined) { cleaned[key] = val; } } return Object.keys(cleaned).length ? cleaned : null;
}
Việc này giúp dữ liệu gọn gàng và an toàn hơn để xử lý tiếp.
4. Chuẩn hóa định dạng ngày với dayjs
npm install dayjs Then use it: const dayjs = require('dayjs'); function fixDate(value) { const parsed = dayjs(value, ['MM-DD-YYYY', 'DD/MM/YYYY', 'YYYY-MM-DD'], true); return parsed.isValid() ? parsed.toISOString() : value;
}
Tất cả ngày tháng được chuyển về định dạng chuẩn ISO: 2024-05-25T00:00:00.000Z
.
5. Loại bỏ dữ liệu trùng lặp trong JavaScript
function deduplicate(data) { const seen = new Set(); return data.filter(row => { const key = JSON.stringify(row); if (seen.has(key)) return false; seen.add(key); return true; });
}
Rất hiệu quả để bắt các dòng trùng lặp có thể gây lỗi logic hoặc vi phạm ràng buộc database.
6. Hàm tổng hợp: Làm sạch File từ A đến Z
async function cleanFile(path) { const raw = await parseCSV(path); const cleaned = raw .map(normalizeHeaders) .map(cleanRow) .filter(Boolean); return deduplicate(cleaned);
}
Giờ bạn sẽ có một mảng object gọn gàng, sạch sẽ, sẵn sàng xử lý.
Điều tuyệt vời nhất? Không cần xử lý Excel phức tạp, không cần Python, không cần lo lắng!
Một số mẹo thêm cho dự án thực tế
- Dùng gói
xlsx
để hỗ trợ đọc file Excel một cách mượt mà. - Ghi log các dòng bị loại bỏ — cực kỳ hữu ích cho việc debug và báo cáo.
- Xác thực sự tồn tại của các cột bắt buộc ngay từ đầu để tránh mất dữ liệu.
- Với các file lớn, hãy xử lý theo kiểu stream để tránh tràn bộ nhớ khi chạy ở môi trường production.
Cảm ơn các bạn đã theo dõi!