Pagini recente » Cod sursa (job #1884278) | Cod sursa (job #2919645) | Cod sursa (job #472687) | Cod sursa (job #657570) | Cod sursa (job #1338420)
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#define INPUT_FILE "convertor.in"
#define OUTPUT_FILE "convertor.out"
using namespace std;
class Json
{
private:
vector< vector<string> > values;
vector<string> keys;
string *raw_json;
public:
Json();
~Json();
string get_raw_json();
void readRaw();
void removeExtras();
void extractKeys();
size_t keys_size();
void extractValues();
void ignorePunct();
void printCSV(ofstream& out);
};
int main()
{
Json *parser = new Json;
//cout << parser->getRaw();
ofstream out(OUTPUT_FILE);
parser->printCSV(out);
out.close();
delete parser;
return 0;
}
Json::Json()
{
readRaw();
removeExtras();
extractKeys();
extractValues();
ignorePunct();
}
Json::~Json(){delete raw_json;}
void Json::readRaw() //read file;
{
ifstream raw(INPUT_FILE);
raw.seekg (0, raw.end);
int file_length = raw.tellg();
raw.seekg (0, raw.beg);
char *buffer = new char [file_length];
raw.read(buffer,file_length);
raw_json = new string(buffer);
delete[] buffer;
raw.close();
}
void Json::removeExtras()
{
bool space_removal = true;
for(size_t i=0; i < raw_json->length(); i++)
{
if(raw_json->at(i)=='\"')
space_removal=!space_removal;
if(space_removal)
switch(raw_json->at(i))
{
case '\n':
case '\r':
case ' ':
raw_json->erase(i,1);
i--;
}
}
//random exception
if(raw_json->at(raw_json->length()-1)!=']')
raw_json->at(raw_json->length()-1)='\0';
}
void Json::extractKeys()
{
size_t end = raw_json->find('}');
size_t key_start=0,key_end=0;
for(size_t i=2; i < end; i++)
{
if(i==2)
key_start=2;
else if(raw_json->at(i)==',')
key_start=i+1;
if(raw_json->at(i)==':')
key_end=i;
if(key_end && key_start)
{
keys.push_back(raw_json->substr(key_start,key_end-key_start));
key_start=0;key_end=0;
}
}
}
string Json::get_raw_json(){return *raw_json;}
size_t Json::keys_size(){return keys.size();}
void Json::extractValues()
{
string item;
size_t elem=0;
size_t v_begin=0,v_end=0;
size_t k=0;
v_begin = raw_json->find(keys[k])+keys[k].length()+1;
while(v_end+2<raw_json->length()-1)
{
v_end = v_begin+1;
if(raw_json->at(v_begin)=='"') //string <- pentru cazul special in care ',' se afla in interiorul string-ului
{
while(raw_json->at(v_end)!='"' && raw_json->at(v_end)!='}') v_end++;
v_end++;
}
else
while(raw_json->at(v_end)!=',' && raw_json->at(v_end)!='}') v_end++;
item=raw_json->substr(v_begin,v_end-v_begin);
k++;
if(k>=keys.size()) k=0;
values.resize(elem+1);
values[elem].push_back(item);
if(k==0) elem++;
v_begin = raw_json->find(keys[k],v_end+1)+keys[k].length()+1;
}
}
void Json::ignorePunct()
{
for(size_t i=0; i<values.size(); i++)
for(size_t j=0; j<values[i].size(); j++)
if(values[i][j].at(values[i][j].length()-1)=='"' && (int)values[i][j].find(",")==-1)
{
values[i][j].erase(values[i][j].length()-1,1);
values[i][j].erase(0,1);
}
for(size_t i=0; i<keys.size(); i++)
if(keys[i].at(keys[i].length()-1)=='"')
{
keys[i].erase(keys[i].length()-1,1);
keys[i].erase(0,1);
}
}
void Json::printCSV(ofstream& out)
{
for(size_t i=0; i<keys.size();i++)
out << keys[i] << ',';
out << '\n';
for(size_t i=0; i<values.size(); i++)
{
for(size_t j=0; j<values[i].size(); j++)
out << values[i][j] << ',';
out << '\n';
}
}