0 👍
172 lượt xem
bởi (🏅0)
Chào mọi người. Em nghĩ đây là vấn đề nhiều bạn giống em sẽ gặp phải. Nhờ mọi người liệt kê các cách xử lý dùm ạ.

File CSV mỗi dòng có 6 ô dữ liệu, kiểu string string string double double.
Trừ dòng đầu tiên đều là string.
Cách xử lý đề bài yêu cầu là dùng hàm cắt chuỗi rồi set giá trị ban đầu lại.
Employee arr[N];

const vector<string> explode(const string& s, const char& c) {
    string buff { "" };
    vector<string> v;

    for (auto n : s) {
        if (n != c)
            buff += n;
        else if (n == c && buff != "") {
            v.push_back(buff);
            buff = "";
        }
    }
    if (buff != "")
        v.push_back(buff);

    return v;
}
1. Vậy set giá trị cho dòng đầu tiên vào mảng thế nào? Nó luôn báo lỗi.
2. Sao không viết tiêu đề riêng để khỏi phải xử lý?
Em xin bổ sung:

1. Một mẫu nhỏ về file CSV
FirstName, LastName, Job, Department, AnnualSalary, EstimatedSalary
a1, a2, a3, a4, 1, 1
b1, b2, b3, b4, 2, 2
c1, c2, c3, c4, 3, 3


2. Một phần đoạn code của em. Nó chạy ok. Tuy nhiên thầy bảo nên viết lại:
Thay vì:
const vector<string> explode(const string& s, const char& c) 

Em nên tạo 1 hàm trả về Employee&:
Employee& explode(const string& s, const char& c). 

Em chưa hiểu lắm.
const int N = 100;
Employee employees[N]; // Employee is a class

void ReadToArray(Employee arr[], string filename) 
{
    int i = 0;
    ifstream file(filename);
    if (file.is_open())
    {
        string line;
        getline(file, line, '\n'); // Mean skip the first line? Right?
        while (getline(file, line))
        {
            vector<string> v = explode(line, ',');
            arr[i].setFirstName(v[0]);
            arr[i].setLastName(v[1]);
            arr[i].setJobTitle(v[2]);
            arr[i].setDepartment(v[3]);
            arr[i].setAnnualSalary(stod(v[4]));
            arr[i].setEstimatedSalary(stod(v[5]));
            i++;
        }
    }
}

void Display(Employee arr[], int size) 
{
    for (int i = 0; i < size; i++) 
    {
        employees[i].printData();
    }
}



int main() 
{
    ReadToArray(employees, "Employees.csv");
    Menu();
    return 0;
}
bởi (🏅151)
Câu hỏi chưa đc rõ ràng, e làm rõ hơn thì mọi người mới support đc
  1. string string string double double => mới có 5 giá trị trong khi lại nói là mỗi dòng có 6 ô dữ liệu
  2. Với hàm explode() thì cần làm rõ chính xác s là gì, c là gì, vector trả về của hàm mong muốn là gì
  3. Mảng Employee chưa thấy liên hệ gì với hàm explode

1 Câu trả lời

+1 👍
bởi (🏅151)
Trả về reference khá là nguy hiểm vì khó quản lý lifetime của biến. Do đó a suggest em truyền reference vào hàm explode() để update vào đó. Code của em sẽ sửa lại kiểu như sau
 
void explode(Employee& employee, const string& s, const char& c) {
    string buff { "" };
    vector<string> v;

    for (auto n : s) {
        if (n != c)
            buff += n;
        else if (n == c && buff != "") {
            v.push_back(buff);
            buff = "";
        }
    }
	if (buff != "")
        v.push_back(buff);
        
	if (v.size() == 6) {
		employee.setFirstName(v[0]);
		employee.setLastName(v[1]);
		employee.setJobTitle(v[2]);
		employee.setDepartment(v[3]);
		employee.setAnnualSalary(stod(v[4]));
		employee.setEstimatedSalary(stod(v[5]));	
	}
}

void ReadToArray(Employee arr[], string filename) 
{
    int i = 0;
    ifstream file(filename);
    if (file.is_open())
    {
        string line;
        getline(file, line, '\n'); // Mean skip the first line? Right?
        while (getline(file, line))
        {
			explode(arr[i], line, ',');
            i++;
        }
    }
}

 
Coding Guru là nơi dành cho cộng đồng lập trình viên Việt Nam hỗ trợ nhau về tất cả các vấn đề liên quan đến công nghệ.

Chúng ta hãy cùng nhau xây dựng một cộng đồng công nghệ Việt Nam mạnh mẽ, thúc đẩy và giúp đỡ nhau cùng phát triển, thăng tiến trong sự nghiệp.

***
Nơi đam mê hội tụ
***

Một số câu hỏi gần đây có thể tương tự hoặc liên quan ↓

0 👍
1 trả lời 130 lượt xem
0 👍
1 trả lời 109 lượt xem
hỏi bởi ẩn danh 20/10/2019
0 👍
2 trả lời 190 lượt xem
hỏi bởi Duy Ngô 10/3/2020
0 👍
1 trả lời 148 lượt xem
...