其实原始的问题是要对excel的文件进行处理的。看来一下需要处理的问题的文件的内容,结构很简单。
一瞬间懒癌发作,直接把文件格式转成了csv。
CSV是一种Excel表格的导出格式,在Excel表格的菜单栏中点击文件->另存为会弹出一个文件夹浏览窗口,在下拉框中可以选择保存格式,其中有一个就是.CSV(逗号分隔符)选项。
CSV表格很官方的规则:
1 开头是不留空,以行为单位。
2 可含或不含列名,含列名则居文件第一行。
3 一行数据不垮行,无空行。
4 以半角逗号(即,)作分隔符,列为空也要表达其存在。
5 列内容如存在半角逗号(即,)则用半角引号(即”“)将该字段值包含起来。
6 列内容如存在半角引号(即”)则应替换成半角双引号(”“)转义,并用半角引号(即”“)将该字段值包含起来。
7 文件读写时引号,逗号操作规则互逆。
8 内码格式不限,可为 ASCII、Unicode 或者其他。
9 不支持特殊字符
CSV表格的用途:
CSV表格也相当于关系数据库中的二维表,但是他并不支持SQL语句的查询,只能通过一些手段将表格内容存入合适的数据结构中便于查询。
我们可以通过文本编辑器看下里面的文本数据:
卡号,密码,面值,地点限制,过期时间
16G10001,2333333,199,,2017年12月31日 08:00
,,,,
1、从文本数据我们可以很直观得看到每一行对应一组数据。
2、每一组数据的元素之间用逗号分隔。
这里我们就可以直接对csv进行一般文件的读取,但是为了获取有意义的信息,每次读取一行:
void split(string str,string separator,vector<string> &result)
{//对每一行以逗号为分隔符进行分割
result.clear();
int cutAt;
while( (cutAt = str.find_first_of(separator)) != str.npos )
{
if(cutAt > 0)
{
result.push_back(str.substr(0, cutAt));
}
str = str.substr(cutAt + 1);
}
if(str.length() > 0)
{
result.push_back(str);
}
}
ifstream file ( "./template/GPLT.csv" );
string row;
getline(file,row);//剔除首部
vector<string> infRow;
int typeChoose;
while ( file.good() )
{
getline(file,row);
split(row,",",infRow);
if(infRow.size())//有效的数据
{
//doSomething
}
}