采集元数据的C++实现
我要做的是提取Test_case的名字,以及Test_case的持续时间(单位秒):下面是一段示例元数据
Start| 20140618 root (6033) | tpi 1.4 | 14:53:52 10050943579848 0 | Start| 20814 SunOS 5.11 11.2 i86pc tcx4440-01 | STF_ENV| STC_NAME = os-zones | STF_ENV| STC_VERSION = 2.10.0 | STF_ENV| STC_OS_VERSION = 5.11 | STF_ENV| STF_EXECUTE_MODE = ipkg:amd64 | STF_ENV| cwd = /opt/stc/suites/os/zones/tests/os/functional | Test_Case_Start| 20858 tests/os/functional/setup | 14:53:52 10051107110387 0 | stdout| stdout| 14:53:53 SUCCESS: zone_is_running zone2 stdout| zone 'zone2' is running stdout| stdout| 14:53:53 SUCCESS: zone_is_running zone1 stdout| zone 'zone1' is running stdout| 14:53:53 zones 'zone2 zone1 ' are running Test_Case_End| 20858 tests/os/functional/setup | PASS | 14:53:53 10052165298138 0 |
我想要得到的结果是:
tests/os/functional/setup 1
由于我的元数据比较小(不会超过20MB,所以我选择用vector),源代码如下:
#include <iostream> #include <vector> #include <string> #include <fstream> #include <cstdlib> using namespace std; /* * There are not split function, you should add one by yourself */ vector<string> split(const string &str, string pattern){ string :: size_type pos; vector <string> result; int size = str.size(); int i = 0; for(i = 0; i < size; i++){ pos = str.find(pattern, i); if(pos < size){ string subStr = str.substr(i, pos - i);//substr(beginPosition, length) //cout<<"i = "<<i<<" ,pos - 1 = "<<pos - 1<<endl; //cout<<str.substr(i, pos - i)<<endl; result.push_back(subStr); i = pos + pattern.size() - 1; //cout<<subStr<<endl; //cout<<"i="<<i<<endl; } } return result; } /* * Duration Time = endTime - startTime * eg: Duration Time = 1:10:08 - 23:08:08 = (25 * 3600 + 10 * 60 + 8) - (23 * 3600 + 8 * 60 + 7) */ int getDurationTime(string startTime, string endTime){ vector<string> startTimeVector; vector<string> endTimeVector; int startTimeSeconds = 0; int endTimeSeconds = 0; startTime = startTime+":";//1:10:08 , if we do not add ":", we can not get 08 endTime = endTime + ":"; endTimeVector = split(endTime, ":"); startTimeVector = split(startTime, ":"); startTimeSeconds = atoi(startTimeVector[0].c_str()) * 3600 + atoi(startTimeVector[1].c_str()) * 60 + atoi(startTimeVector[2].c_str()); endTimeSeconds = atoi(endTimeVector[0].c_str()) * 3600 + atoi(endTimeVector[1].c_str()) * 60 + atoi(endTimeVector[2].c_str()); if(endTimeSeconds < startTimeSeconds) { endTimeSeconds = endTimeSeconds + 24 * 3600; } // cout<<"endTimeSeconds:"<<endTimeSeconds << " startTimeSeconds:"<<startTimeSeconds<<endl; // cout<<endTimeSeconds - startTimeSeconds<<endl; return endTimeSeconds - startTimeSeconds; } int main() { vector< pair<string, int> > caseDurationVec; string journalInput = "journal.base"; string journalOutput = "journal.base.out"; ifstream infile(journalInput.c_str()); ofstream outfile(journalOutput.c_str()); string buffer; const string Case_Start = "Test_Case_Start"; const string Case_End = "Test_Case_End"; int i = 0; vector<string> resultVec; string caseStartTime = ""; string caseEndTime = ""; while(getline(infile, buffer)){ if(buffer.find(Case_Start) != buffer.npos){ resultVec = split(buffer," "); caseStartTime = resultVec[4]; } if(buffer.find(Case_End) != buffer.npos){ resultVec = split(buffer," "); caseEndTime = resultVec[6]; caseDurationVec.push_back(make_pair<string, int>(resultVec[2], getDurationTime(caseStartTime, caseEndTime))); cout<<"There are "<<i++<<"cases"<<endl; } } vector< pair<string, int> > :: iterator iter; for(iter = caseDurationVec.begin(); iter != caseDurationVec.end(); iter++) { outfile<<iter->first<<" "<<iter->second<<endl; } infile.close(); outfile.close(); //system("pause"); return 1; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。