Đọc/ghi file CSV
CSV (Comma-Separated Values) là định dạng file văn bản đơn giản để lưu dữ liệu dạng bảng, mỗi dòng là một bản ghi, các giá trị cách nhau bởi dấu phẩy. C++ không có thư viện đọc CSV sẵn có trong chuẩn, nhưng có thể tự xử lý bằng <fstream> và <sstream>.
Ghi dữ liệu ra file CSV
Phần tiêu đề “Ghi dữ liệu ra file CSV”#include <fstream>#include <vector>#include <string>
int main() { std::ofstream file("students.csv");
file << "Ten,Tuoi,GPA" << std::endl; // Dòng tiêu đề
file << "Alice,20,3.8" << std::endl; file << "Bob,22,3.5" << std::endl; file << "Charlie,21,3.9" << std::endl;
file.close(); return 0;}Đọc và phân tách dữ liệu CSV
Phần tiêu đề “Đọc và phân tách dữ liệu CSV”#include <fstream>#include <sstream>#include <iostream>#include <string>#include <vector>
int main() { std::ifstream file("students.csv"); std::string line;
while (std::getline(file, line)) { std::stringstream ss(line); std::string cell; std::vector<std::string> row;
while (std::getline(ss, cell, ',')) { // Tách theo dấu phẩy row.push_back(cell); }
for (const std::string& value : row) { std::cout << value << " | "; } std::cout << std::endl; }
return 0;}Bỏ qua dòng tiêu đề
Phần tiêu đề “Bỏ qua dòng tiêu đề”#include <fstream>#include <sstream>#include <iostream>
int main() { std::ifstream file("students.csv"); std::string line;
std::getline(file, line); // Đọc và bỏ qua dòng đầu tiên (tiêu đề)
while (std::getline(file, line)) { std::stringstream ss(line); std::string name, age_str, gpa_str;
std::getline(ss, name, ','); std::getline(ss, age_str, ','); std::getline(ss, gpa_str, ',');
int age = std::stoi(age_str); double gpa = std::stod(gpa_str);
std::cout << name << " - " << age << " tuoi - GPA " << gpa << std::endl; }
return 0;}Lưu ý khi làm việc với CSV thủ công
Phần tiêu đề “Lưu ý khi làm việc với CSV thủ công”- CSV “chuẩn” hỗ trợ giá trị chứa dấu phẩy bằng cách bao trong dấu ngoặc kép (
"Nguyen, Van A") - cách tách bằng dấu phẩy đơn giản ở trên không xử lý được trường hợp này - Với dữ liệu CSV phức tạp (có dấu ngoặc kép, ký tự đặc biệt, xuống dòng trong ô…), nên cân nhắc dùng thư viện bên thứ ba (như rapidcsv) thay vì tự viết parser
Tổng kết
Phần tiêu đề “Tổng kết”- CSV lưu dữ liệu dạng bảng dưới dạng text, các giá trị trên một dòng cách nhau bởi dấu phẩy
- Ghi file CSV: dùng
std::ofstreamvà toán tử<<để tạo từng dòng - Đọc file CSV: đọc từng dòng bằng
std::getline, sau đó dùngstd::stringstreamđể tách các giá trị theo dấu phẩy - Cách tách bằng dấu phẩy đơn giản không xử lý được giá trị chứa dấu phẩy trong ngoặc kép - cần thư viện chuyên dụng cho trường hợp phức tạp