#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void) {
FILE *fin = fopen("convertor.in", "r");
FILE *fout = fopen("convertor.out", "w");
char linie[1025];
memset(linie, 0, 1025);
char *auxiliar;
int i, semHead = 0, contElem, lungime = 0;
int counting = 0;
char elements[10128][128];
char aux;
char *cuv = (char*)calloc(1025, sizeof(char));
char *sep = "\"";
//Citire pana la terminarea fisierului
while( !feof ( fin ) ) {
//citim caracter cu caracter
fread(&aux, sizeof(char), 1, fin);// = fgetc(fin); sau //fgetcscanf(fin, "%c", &aux) != EOF;
//Incep sa retin o linie de JSON, care incepe cu '{' si se termina cu '}'
if(aux == '{'){
lungime = 0;
counting = 1;
}
//Se adauga doar daca este informatie dintr-o linie JSON, si caracterul nu este newline
if(aux != '\n' && counting == 1 ){
//Formatam astfel incat toate cheile sa fie intre " ", deoarece numerele nu sunt;
//
if(isspace(aux) || aux < 0){
//Eleminam orice spatiul dintre ':' si valoarea cheii
if(linie[lungime - 1] != ':' && linie[lungime - 1] != ',' && linie[lungime - 1] != '"' ){
linie[lungime] = aux;
lungime++;
}
}
else{
//Daca dupa ':' nu avem ", adaugam;
if(aux != '"' && linie[lungime - 1] == ':'){
linie[lungime] = '"';
lungime++;
}
//Daca inainte de ',' nu avem ", adaugam;
if(aux == ',' && linie[lungime - 1] != '"'){
linie[lungime] = '"';
lungime++;
}
//Daca inainte de '}' nu avem ", adaugam
if(aux == '}' && linie[lungime - 1] != '"'){
linie[lungime] = '"';
lungime++;
}
linie[lungime] = aux;
lungime++;
}
}
//Terminam de inregistrat linia, o prelucram;
if(aux == '}' && counting == 1){
printf("%s\n", linie);
contElem = 0;
auxiliar = strdup(linie);//strcpy(auxiliar, linie);
//Prelucram dupa separatorul "
// sep = "\"";
cuv = strtok(auxiliar, sep);
while(cuv != NULL){
strcpy(elements[contElem], cuv);
contElem++;
cuv = strtok(0, sep);
}
cuv = (char*)calloc(1025, sizeof(char));
//Afisam o singura data antetul de tabel;
if(semHead == 0){
for(i = 1; i < contElem - 1; i = i + 4)
fprintf(fout, "%s,", elements[i]);
semHead = 1;
fprintf(fout, "\n");
}
//Afisam valorile tabelului;(sunt din 4 in 4, daca dorim element, pornim de la al token 3(elements[3]), daca dorim cap de tabel, de la elem[1];
for(i = 3; i < contElem; i = i + 4)
fprintf(fout, "%s,", elements[i]);
fprintf(fout, "\n");
//Am prelucrat linia, cautam alta linie JSON;
//Resetam contorul, lungimea linie, valorile din linie;
lungime = 0;
counting = 0;
// printf("%s\n", linie);
memset(linie, 0, 1025);
// printf("%c", aux);
}
}
fclose(fin);
fclose(fout);
return 0;
}