文件根据自己的格式去解析,本文只是一个示例,读取方式是按行读取
#include "stdafx.h"
#include <string>
#include <vector>
#include <map>
#include <fstream>
#include <iostream>
#include <streambuf>
void trim(std::string& s)
{
std::vector<char> v;
for (const auto& c : s)
{
if (isalnum(c) || c=='.')
{
v.push_back(c);
}
}
s.replace(s.begin(), s.end(), v.begin(), v.end());
}
int main()
{
std::vector<std::map <std::string, std::string>> logs;
auto fp = fopen("ELC_2017-09-22_19-05-44.log","r");
if (fp)
{
std::map<std::string, std::string> m;
for (char buf[1024] = { 0 }; fgets(buf, 1024, fp) != nullptr; )
{
std::string line(buf);
if (line.find("{") != std::string::npos)
{
m.clear();
}
else if (line.find('}') != std::string::npos)
{
logs.push_back(std::move(m));
}
else
{
auto pos = line.find(":");
if (pos != std::string::npos)
{
auto k = line.substr(0, pos);
trim(k);
auto v = line.substr(pos + 1);
trim(v);
m[k] = v;
}
}
memset(buf, 0, 1024);
}
fclose(fp);
}
std::ofstream ofs;
ofs.open("elc.csv", std::ios::out | std::ios::trunc);
for (const auto& m : logs)
{
std::string addr, recv, send;
auto it = m.find("address");
addr = (it != m.end()) ? it->second : "";
it = m.find("Received");
recv = (it != m.end()) ? it->second : "";
it = m.find("Sented");
send = (it != m.end()) ? it->second : "";
ofs << addr << "," << recv << "," << send << std::endl;
}
ofs.close();
return 0;
}