Đọc file CSV ra từng phần

Em đang muốn đọc 1 file csv ra thành các mục theo từng cột trong file đó, mỗi mục trong file đó cách nhau bằng dấu “,”, và cuối mỗi hàng cũng là dấu “,”. Sao em làm như này lại không đúng ạ?
Các bác chỉ em với

int main(){
   ifstream f("cities.csv");
   if (!f.is_open())
   	cout << "Error File Open";
   City* cityInfo = new City;
   int i = 0;
   string line;
   getline(f, line);
   while (f) {
   	
   	getline(f, cityInfo[i].id, ',');
   	getline(f, cityInfo[i].name, ',');
   	getline(f, cityInfo[i].start_year, ')');
   	cout << cityInfo[i].id;
   	cout << cityInfo[i].name;
   	cityInfo[i].start_year = cityInfo[i].start_year - 'POINT';
   	cout << cityInfo[i].start_year;
   	i++;
   }
   
   f.close();
}

File đó có dạng:

id,name,coords,start_year,url_name,country,country_state
5,Aberdeen,POINT(-2.15 57.15),2017,aberdeen,Scotland,
6,Adelaide,POINT(138.6 -34.91666667),2017,adelaide,Australia,
7,Algiers,POINT(3 36.83333333),2017,algiers,Algeria,

Em muốn lấy ra id[0] = 5, id[1] = 6, tương tự với name, start_year ạ

Đọc cả dòng 1 lần (getline()) và dùng strtok() để lấy từng phần, kết hợp với stoi()stof() để chuyển về dạng số.

Bạn chưa đọc giá trị coords mà đã đọc start_year.
Và để ý là dấu phẩy cuối cùng là ngăn cách countrycountry_state. Do country_state không có dữ liệu nên trống sau dấu phẩy.

5 Likes

Em cảm ơn ạ, mà bác xem cái trên sao lại chỉ đọc được mỗi 1 lần, mà nó không tăng i lên

Sao em làm thế này lại bị lỗi vậy bác?

struct TCity {
	// The structure to store city information
	string id, start_year;
	string name, coords, url_name, country, country_state;
};
typedef TCity City;


int main() {
  ifstream  f("cities.csv");
  if(!f.is_open())
    cout << "Failed";
  City* mycity = new City;
  int i = 0;
  string line;
 
 
 while(f){
   getline(f, line);
   cout << line << "\n";
    mycity[i].id = strtok(line, ",");
   cout << mycity[i].id;
 }
}

Bạn không tăng lên mà! Cái i++ đâu rồi?

while(f){
    getline(f, line);
    cout << line << "\n";
    mycity[i].id = strtok(line, ",");
    mycity[i].name = strtok(NULL, ",");
    mycity[i].coords = strtok(NULL, ",");
    mycity[i].start_year = strtok(NULL, ",");
    // Cứ thế theo trình tự
    // id,name,coords,start_year,url_name,country,country_state
    cout << mycity[i].id;
    i++; // Tăng i
}
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?