Cod sursa(job #1349073)

Utilizator teo721Pavel Teo teo721 Data 19 februarie 2015 23:13:33
Problema Convertor Scor 0
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 4.52 kb
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <list>
using namespace std;
list<string> get_keys(string input_string){
	input_string = input_string.erase(0,1);
	list<string> keys;
  	std::size_t found = 0;
  	std::size_t start = 0; 
  	string str_final = "\":";
  	string str_inceput = "\"";
  	
    while (found!=std::string::npos )
  	{
  		found = input_string.find(str_final);
  		if( found != start){
  			string object = input_string.substr(start,found);
  			std::size_t found2 = object.rfind(str_inceput);
  			
  			object = object.substr(found2+1,found);
    		if( found < input_string.size())
          keys.push_back(object);
    		input_string = input_string.erase(start,found+4);
    	}
    		
  	}
  	return keys;
}
list<string> from_string_to_objects(string input_string){
	list<string> objects;
  	
	std::size_t found = 0;
  	std::size_t start = 0; 
  	while (found!=std::string::npos )
  	{
  		found = input_string.find("},");
  		if( found != start){
  			string object = input_string.substr(start,found);
    		objects.push_back(object);
    		input_string = input_string.erase(start,found+4);
    		
      }
    		
  	}
  	return objects;
}
bool test_cifra(char c){
  switch(c){
    case '0':
      return true;
      break;
    case '1':
      return true;
      break;
    case '2':
      return true;
      break;
    case '3':
      return true;
      break;
    case '4':
      return true;
      break;
    case '5':
      return true;
      break;
    case '6':
      return true;
      break;
    case '7':
      return true;
      break;
    case '8':
      return true;
      break;
    case '9':
      return true;
    default: return false;
  }
}

list<string> get_values(string str, list<string> keys){
	list<string> values;
  std::size_t found_key1 = 0;

  int key1_length = 0;
  for (std::list<string>::iterator it=keys.begin(); it != keys.end(); ++it){
    string key = *it;
    std::size_t found_key2 = str.find(key);   
    string value = str.substr(found_key1 + key1_length,found_key2 - found_key1 - key1_length);
    
    if (value != "\""){
      values.push_back(value);
    }
    found_key1 = found_key2;
    key1_length = key.size();
  }
  string value = str.substr(found_key1 + key1_length, str.size());
  values.push_back(value);
  
  for (std::list<string>::iterator it=values.begin(); it != values.end(); ++it){
    std::size_t found = (*it).find(":");
    (*it).erase(0,found+1);
  }


  for (std::list<string>::iterator it=values.begin(); it != values.end(); ++it){
    std::size_t found_first = (*it).find("\"");
    std::size_t found_second = (*it).find("\"",found_first + 1);
    
    if ( found_second <= (*it).size() ){
      *it = (*it).substr(found_first+1,found_second-found_first-1);
    }
    else{
      string aux = *it;
      string cifra;
      for ( std::string::iterator it_string=aux.begin(); it_string!=aux.end(); ++it_string){
        if(test_cifra(*it_string) ){
          cifra += *it_string;
        }
      }
      *it = cifra;
      
    }
    
  }
  
  
  return values;
}

list<list<string> > get_list_of_values(list<string> objects,list<string> keys){
	list<list<string> > list_values;
	while (!objects.empty())
  	{
  		//std::cout << ' ' << objects.front()<<endl;
    	list<string> values = get_values(objects.front(),keys);
    	objects.pop_front();
    	list_values.push_back(values);
  	}
  return list_values;
}

void cvs_write(list<string> keys,list<list<string> > list_values){
  ofstream output_file("convertor.out");
  while (!keys.empty()){
    output_file<<keys.front()<<",";
    keys.pop_front();
  }
  output_file<<"\n";
  int n = list_values.size();
  int i = 1;
  while (!list_values.empty()){
    list<string> values = list_values.front();
    while (!values.empty()){
      output_file<<values.front()<<",";
      values.pop_front();
    }
    if(i<n){
      output_file<<"\n";
    }
    i++;
    list_values.pop_front();
  }
  output_file.close();
}

string json_read(){
  string line,input_string;
  ifstream input_file("convertor.in");
  while ( getline (input_file,line) ){
      input_string += line;
      //output_file<<line<<"\n";
  }
  input_string = input_string.erase(0,4);
  int n = input_string.size();
  input_string = input_string.erase(n-3);


  input_file.close();
  return input_string;
}

int main () {

	string input_string = json_read();
	list<string> objects = from_string_to_objects(input_string);
  list<string> keys = get_keys(objects.front());
  list<list<string> > list_values = get_list_of_values(objects,keys);
  cvs_write(keys,list_values);
  
  return 0;
}