c++读写操作CSV文件
2017-04-25 11:37
573 查看
/*************************************************************************************************** 文件作用: CSV数据文件的处理 开发环境: Win10+STL 时间地点: 文津楼 2017.4.24 作 者: 九月 ****************************************************************************************************/ #include <vector> #include <string> #include <fstream> #include <iostream> #include <sstream> using namespace std; int main(int argc, char* argv[]) { std::string strFileName = "D:\\wang_csv\\test3.csv"; //【0】文件名 std::fstream file; //【1】声明一个文件输入输出流对象 file.open(strFileName.c_str(),std::ios::in); //【2】以读文件的方式打开文件 if(!file.is_open()) { std::cout<<"【NOTICE】The file is loaded unsuccessfully!"<<std::endl; std::system("pause"); } else { std::cout<<"【NOTICE】The file is loaded successfully and the file is being read........"<<std::endl; std::cout<<"【NOTICE】Press any key to continue,please!"<<std::endl; std::system("pause"); } std::string strTemp; std::vector<string> strLinesBuffer; //【1】以行的形式存储CSV文件读入的内容 std::vector<string> strAll; //【2】以单个字段的形式存储CSV文件中所有的内容 std::vector<std::vector<string>> strTable; //【3】存储表格中的内容 int iRows = 0; //【1】CSV文件中的行数 int iCols = 0; //【2】CSV文件中的列数 while(getline(file,strTemp)) { strLinesBuffer.push_back(strTemp); std::cout<<strTemp<<std::endl; char* tmpString; tmpString=strtok((char*)strTemp.c_str(),";"); while (tmpString) { if(!strcmp(tmpString,"")) { std::system("pause"); } else { strAll.push_back(tmpString); std::cout<<tmpString<<std::endl; } tmpString = strtok(NULL,";"); } strTable.push_back(strAll); } iRows = strTable.size(); iCols = strAll.size()/iRows; std::cout<<"[1]CSV文件中行的总数"<<iRows<<std::endl; std::cout<<"[2]CSV文件中列的总数"<<iCols<<std::endl; double dSum = 0; std::vector<double> doubleTable; /*********************************************************************************************************** 模块说明: 将读入的CSV表格(字符串)格式-----转化为-----可以用于计算的double型表格 ************************************************************************************************************/ for(int i=0;i<53;i++) { for(int j=0;j<11;j++) { std::string tmp = (strAll[i*iRows+j]); std::istringstream isStrTmp(tmp); double num = 0.0; isStrTmp>>num; std::printf("%f",num); doubleTable.push_back(num); } std::cout<<std::endl; } /*********************************************************************************************************** 模块说明: 1)以上模块已经将CSV中的数据准备完毕 2)已经将数据转化为可用于计算的double型数据,并且,数据以单纬动态数组的形式存储于doubleTable ************************************************************************************************************/ double sum = 0.0; int iCalCol = 1; //【1】待计算第几列的数据,列标号 for(int i=0;i<50;i++) { for(int j=0;j<11;j++) { if(j == iCalCol) { sum += doubleTable[i*iRows+j]; } } //std::cout<<std::endl; } std::cout<<"[Output Information]第"<<iCalCol<<"列的平均值 = "<<sum/iRows<<std::endl; std::system("pause"); return 0; }