c++ 用 list 或者 map 对 csv文件进行删减

把csv文件中 空格 和出错信息“#N/A”整行信息删除
最终只保留 StuNum(学号)、class(班级)、Dorm(宿舍)三列(删除其他三列)
部分内容如下:
图片说明

结果如图
图片说明

 struct TcsvMake
{
    int id;
    string Name;
    int StuNum;
    int class;
    int Dorm;
    int Age;
};
typedef list<TcsvMake> LISTcsvMake;

请大神指点

 // CFileRead.h
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <list>
using namespace std;

struct TcsvMake
{
    int id;
    string Name;
    int StuNum;
    int class;
    int Dorm;
    int Age;
};
typedef list<TcsvMake> LISTcsvMake;

class CFileRead
{

public:
    void readCSV(ifstream &input);
    LISTcsvMake m_csvMakeList;

};

 //CFileRead.cpp
#include<iostream>
#include <list>
#include"CFileRead.h" 

#include "string.h"
#pragma warning(disable:4996)
using namespace std;

void CFileRead::readCSV(ifstream &input)
{

    string csvLine;// 从输入流中读取每一行
    getline(input, csvLine);
    while (getline(input, csvLine))
    {
        TcsvMake tcsv;
        char *csv = (char*)csvLine.data();

        if (NULL != csv)
        {
            string id = strtok(csv, ",");
            istringstream csvStream(id);
            csvStream >> tcsv.id;

            string name = strtok(NULL, ",");
            istringstream CsvStream(name);
            CsvStream >> tcsv.Name;

            string stuNum = strtok(NULL, ",");
            istringstream cSvStream(stuNum);
            cSvStream >> tcsv.StuNum;

            string class = strtok(NULL, ",");
            istringstream csVStream(class);
            csVStream >> tcsv.class;

            string dorm = strtok(NULL, ",");
            istringstream CSvStream(dorm);
            CSvStream >> tcsv.Dorm;

            string age = strtok(NULL, ",");
            istringstream CSVStream(age);
            CSVStream >> tcsv.Age;

            m_csvMakeList.push_back(tcsv);
        }
    }   
}
 void readCSV(istream &input, list<string > &output)
{
    string csvLine;
    // read every line from the stream
    while (getline(input, csvLine))
    {
        istringstream csvStream(csvLine);
        list<string> csvColumn;
        string csvElement;
        // read every element from the line that is seperated by commas and put it into the vector or strings
        while (getline(csvStream, csvElement, ','))
        {
            csvColumn.push_back(csvElement);
        }
        output.push_back(csvColumn);
    }
}

本来是把文件内容一行一行读进 list 然后在再遍历删除的,可是太麻烦了而且出错很多

在另一个帖子里看到一种新思路,可以用定义一个结构体 struct ,把每列列数据写进 list 的节点里

但是用这个方法的话,第一步文件怎么读入list 都不会了,哪位好心的大神能指点一下吗?

结构体只是相当于数组而已。。
数据一行一行的读,并判断是否#N/A ,数据正确写入结构体数组。。

    struct TcsvMake
    {
        int StuNum;
        int class;
        int Dorm;   
    };
    typedef list<TcsvMake> LISTcsvMake;