Bỏ qua để đến nội dung

Đọ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><sstream>.

#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;
}
#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;
}
#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;
}
  • 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
  • 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::ofstream và toán tử << để tạo từng dòng
  • Đọc file CSV: đọc từng dòng bằng std::getline, sau đó dùng std::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