Comment on page

LogParser

Given a txt document consisting of log information, find time as a percentage - spent connected.
  • The time started is the first line, and the time ended is the last line.
  • Information inbetween consists of various information, but what we are interested in the total amount of time connected vs time total amount of time disconnected.
Examples
(11/01/2015-04:00:00) :: START
(11/01/2015-04:00:00) :: CONNECTED
(11/01/2015-04:30:00) :: DISCONNECTED
(11/01/2015-04:45:00) :: CONNECTED
(11/01/2015-05:00:00) :: SHUTDOWN
output: 75%
(11/01/2015-03:30:00) :: START
(11/01/2015-03:30:00) :: CONNECTED
(11/01/2015-04:00:00) :: DISCONNECTED
(11/01/2015-04:15:00) :: SHUTDOWN
output: 66%
(01/01/2015-00:00:00) :: START
(01/01/2015-00:00:05) :: CONNECTED
(01/01/2015-00:01:23) :: UI - HUD animation state changed
(01/01/2015-00:03:47) :: ERROR - Unknown error
(01/01/2015-00:12:11) :: DISCONNECTED
(01/01/2015-00:13:14) :: UI - HUD animation state changed
(01/01/2015-00:13:50) :: CONNECTED
(01/01/2015-00:17:20) :: UI - HUD animation state changed
(01/01/2015-00:21:06) :: Crash report sent to server successfully
(01/01/2015-00:22:00) :: Warning: please implement this
(01/01/2015-00:23:50) :: Warning: please implement this
(01/01/2015-00:28:41) :: DISCONNECTED
(01/01/2015-00:31:31) :: UI - HUD animation state changed
(01/01/2015-00:32:12) :: ERROR - Unknown error
(01/01/2015-00:35:45) :: CONNECTED
(01/01/2015-00:36:50) :: DISCONNECTED
(01/01/2015-00:37:01) :: Warning: please implement this
(01/01/2015-00:38:22) :: Crash report sent to server unsuccessfully
(01/01/2015-00:38:23) :: ERROR - Unknown error
(01/01/2015-00:39:17) :: CONNECTED
(01/01/2015-00:40:40) :: UI - HUD animation state changed
(01/01/2015-00:40:42) :: UI - HUD animation state changed
(01/01/2015-00:42:15) :: Crash report sent to server successfully
(01/01/2015-00:42:30) :: DISCONNECTED
(01/01/2015-00:43:56) :: UI - HUD animation state changed
(01/01/2015-00:44:18) :: CONNECTED
(01/01/2015-01:00:00) :: SHUTDOWN
78%
class LogParser {
public:
static std::string parseFile(const std::string&);
static std::string parseLines(const std::vector < std::string >& lines);
};
class Time {
public:
Time(string time) {
parse(time);
}
Time(int short h, int short m, int short s) {
hr = h; min = m; sec = s;
}
Time() { hr = min = sec = 0; }
friend Time operator-(const Time &one, const Time &two);
void operator +=(const Time& rhs) {
hr = rhs.hr + hr;
min = rhs.min + min;
sec = rhs.sec + sec;
}
void operator=(const Time &rhs) {
hr = rhs.hr;
min = rhs.min;
sec = rhs.sec;
}
// this function also takes care of
// negatives e.g. 01:-15:00
float convert_to_min() {
float hr_min = hr * 60;
float sec_min = sec / 60;
return hr_min + min + sec_min;
}
int short hr, min, sec;
private:
void parse(string &time) {
hr = atoi(time.substr(0, 2).c_str());
min = atoi(time.substr(3, 5).c_str());
sec = atoi(time.substr(6, 8).c_str());
}
};
float get_ratio(Time & t1, Time & t2)
{
return t1.convert_to_min() / t2.convert_to_min();
}
Time operator-(const Time &one, const Time &two) {
int h, m, s;
h = one.hr - two.hr;
m = one.min - two.min;
s = one.sec - two.sec;
return Time(h, m, s);
}
std::string LogParser::parseFile(const std::string& filename) {
std::ifstream ifs(filename.c_str(), std::ios::in);
if (!ifs) { throw "File not found!"; }
std::vector < std::string > lines;
std::string line;
while (std::getline(ifs, line)) {
lines.push_back(line);
};
return LogParser::parseLines(lines);
}
std::string LogParser::parseLines(const std::vector <std::string>& lines) {
// get the start and end time
Time very_start(lines.at(0).substr(12, 8));
Time very_end(lines.at(lines.size() - 1).substr(12, 8));
Time length = very_start - very_end;
bool is_disconnect = false;
bool is_connected = false;
Time sum_disconnect;
Time start, end;
// ignore first 2 lines
for (int i = 2; i < lines.size(); i++) {
string cur_str = lines.at(i);
string sub_str_status = cur_str.substr(25, cur_str.length() - 1);
string cur_time = cur_str.substr(12, 8);
if (sub_str_status == "CONNECTED" || sub_str_status == "SHUTDOWN") {
is_connected = true;
end = Time(cur_time);
}
else if (sub_str_status == "DISCONNECTED" ){
is_disconnect = true;
start = Time(cur_time);
}
if (is_disconnect && is_connected) {
sum_disconnect += start - end;
is_disconnect = is_connected = false;
}
}
Time diff = length - sum_disconnect;
string final_str = to_string(get_ratio(diff, length));
return final_str.substr(2,2) + "%";
}
int main(int argc, char** argv)
{
LogParser p;
cout << p.parseFile(argv[1]) << endl;
}