Cod sursa(job #1338458)

Utilizator Tzappy90Mihalache Constantin Tzappy90 Data 10 februarie 2015 02:22:20
Problema Convertor Scor 70
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 3.31 kb
#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';
	}
}