把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;