parsingcsv文件c ++

我必须parsing几个具有相同基本结构的csv文件,我必须将值保存在不同的matrix中。 我想保存每个表格在一个单一的matrix,但问题是,我有一些与endline字符的问题。 我试图使用getline函数,但是当parsing表时我无法终止while循环。

我使用这个代码:

 // MMDS.cpp : definisce il punto di ingresso dell'applicazione console. // #include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <vector> #include <map> using namespace std; int i = 0, j = 0 , z=0; int main() { ifstream file("I_30_2_02_02_1.csv"); // declare file stream string value; string intvalue; string check; int jobs; int machines; int resources; vector<string> JobTime; vector<string> MachineId; vector<string> ProcTime; //archiviato come JobId MachineId ProcTime //prime tre righe getline(file, value, ';'); // #jobs getline(file, intvalue, '\n'); jobs = stoi(intvalue); cout << "Jobs: " <<jobs << "\n"; getline(file, value, ';'); //#machines getline(file, intvalue, '\n'); machines = stoi(intvalue); cout << "Machines: " << machines << "\n"; getline(file, value, ';'); //#resources getline(file, intvalue, '\n'); resources = stoi(intvalue); cout << "Resources: " << resources << "\n"; //scritte inutili getline(file, value, ';'); cout << value << " "; getline(file, value, ';'); cout << value << " "; getline(file, value, '\n'); cout << value << "\n"; //primo ciclo while (getline(file, intvalue)) { getline(file, intvalue, ';'); JobTime.push_back(intvalue); getline(file, intvalue, ';'); MachineId.push_back(intvalue); getline(file, intvalue, '\n'); ProcTime.push_back(intvalue); //getline(file, intvalue, '\n'); } for (i = 0; i <= ProcTime.size(); i++) cout << JobTime[i] << " " << MachineId[i] << " " << ProcTime[i] <<endl; cin >> intvalue; return 0; } 

csv文件是:

 #Jobs;30 #Machines;2 #Resources;4 JobId;MachineId;PrTime 1;1;12 2;0;97 3;1;54 4;1;83 5;1;56 6;0;5 7;0;18 8;1;17 9;0;15 10;0;83 JobId;DueDate;RelDate;TardPenalty 1;575;4;1 2;563;70;2 3;483;1;8 4;519;68;1 5;540;64;10 6;546;126;8 7;550;2;6 

每个表由其他人用一个空行分隔。 有人可以帮我读每张表吗? 非常感谢

你可以使用peek()函数。
检查file.peek()!='\ n'
下面的代码应该适合你。

 #include <iostream> #include <fstream> #include <string> #include <vector> #include <map> using namespace std; int i = 0, j = 0 , z=0; int main() { ifstream file("I_30_2_02_02_1.csv"); // declare file stream if(!file) return 0; string value; string intvalue; string check; int jobs; int machines; int resources; vector<string> JobTime; vector<string> MachineId; vector<string> ProcTime; //archiviato come JobId MachineId ProcTime //prime tre righe getline(file, value, ';'); // #jobs getline(file, intvalue, '\n'); jobs = stoi(intvalue); cout << "Jobs: " <<jobs << "\n"; getline(file, value, ';'); //#machines getline(file, intvalue, '\n'); machines = stoi(intvalue); cout << "Machines: " << machines << "\n"; getline(file, value, ';'); //#resources getline(file, intvalue, '\n'); resources = stoi(intvalue); cout << "Resources: " << resources << "\n"; //scritte inutili getline(file, value, ';'); cout << value << " "; getline(file, value, ';'); cout << value << " "; getline(file, value, '\n'); cout << value << "\n"; //primo ciclo while (file.peek()!='\n') { getline(file, intvalue, ';'); JobTime.push_back(intvalue); getline(file, intvalue, ';'); MachineId.push_back(intvalue); getline(file, intvalue, '\n'); ProcTime.push_back(intvalue); //getline(file, intvalue, '\n'); } for (i = 0; i < ProcTime.size(); i++) cout << JobTime[i] << " " << MachineId[i] << " " << ProcTime[i] <<endl; cin >> intvalue; return 0; } 

也许尝试if (entry.empty()) ,或一些这样的条件。 另外,我认为getline()返回行的长度(0是空的,所以空行将> 0)。 所以它应该像find空行的大小一样简单。

 while (getline(file, intvalue)) { if (intvalue > 0) { getline(file, intvalue, ';'); JobTime.push_back(intvalue); getline(file, intvalue, ';'); MachineId.push_back(intvalue); getline(file, intvalue, '\n'); ProcTime.push_back(intvalue); } else { break; } } 

或者类似的东西。 如果intvalue > 0不起作用,那么find空行的大小,并用它作为条件。

编辑 :作为替代,getline()也可以返回一个string。 在我看来,这有利于search。 我在下面写了一个快速的例子。

 size_t pos; std::string str; std::string token; std::vector<std::string> line; // get the entire line while ( getline(file, str) ) { while ( (pos = str.find(';')) != std::string::npos) { // get content up to next semicolon token = str.substr(0, pos); line.push_back(token); str.erase(0, pos + 1); } // get content to the end token = str.substr(0, pos); line.push_back(token); } 

第二个while循环查找每个分号,推送内容,然后将其擦除。 在while循环之后,push_back()是从最后一个分号到结尾的其余行。