Cod sursa(job #1359621)

Utilizator Raz_Van_BarbascuBarbascu Razvan Raz_Van_Barbascu Data 25 februarie 2015 00:17:20
Problema Convertor Scor 70
Compilator java Status done
Runda rosedu_cdl_2015 Marime 4.69 kb
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

interface Printable {
    void printHead(PrintWriter writer);

    void printData(PrintWriter writer);
}

abstract class Field {
    private String name;

    public Field(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract String getVal();

    public abstract void setVal(String string);
}

class Str_Field extends Field {

    private String val;

    public Str_Field(String name) {
        super(name);
    }

    public Str_Field(String val, String name) {
        super(name);
        this.val = val;
    }

    @Override
    public String getVal() {
        return val;
    }

    @Override
    public void setVal(String string) {
        int index = string.indexOf('"') + 1;
        val = string.substring(index, string.indexOf('"', index));
    }
}

class Num_Field extends Field {

    private int val;

    public Num_Field(String name) {
        super(name);
    }

    public Num_Field(int val, String name) {
        super(name);
        this.val = val;
    }

    @Override
    public String getVal() {
        return ((Integer) val).toString();
    }

    @Override
    public void setVal(String string) {
        val = Integer.parseInt(string.replaceAll("[^0-9]+", ""));
    }

}

class Json implements Printable {

    private final ArrayList<Field> fields;

    public Json() {
        fields = new ArrayList<>();
    }

    void convert(String inputFileName, String outputFileName) {
        PrintWriter writer;
        int index;
        String[] split;
        String[] field;
        String fieldName;
        try {
            
            Scanner reader = new Scanner(new FileInputStream(inputFileName));
            reader = reader.useDelimiter("[{}]");
            String next = reader.next();
            writer = new PrintWriter(outputFileName);
            //learning phase
            if (reader.hasNext()) {
                next = reader.next();
                next = next.replace("\r\n", "");
                next = next.trim();
                if (!next.matches("\\s*,*\\s*")) {
                    split = next.split(",");

                    for (String unparsedFields : split) {
                        field = unparsedFields.split(":");
                        index = field[0].indexOf('"') + 1;
                        fieldName = field[0].substring(index,
                                field[0].indexOf('"', index));
                        if (field[1].indexOf('"') >= 0) {
                            index = field[1].indexOf('"') + 1;
                            fields.add(new Str_Field(field[1].substring(index,
                                    field[1].indexOf('"', index)), fieldName));
                        } else {
                            fields.add(new Num_Field(Integer.parseInt(field[1]
                                    .replaceAll("[^0-9]+", "")), fieldName));
                        }
                    }
                    
                    printHead(writer);
                    printData(writer);
                }
            }
            //processing phase
            while (reader.hasNext()) {

                next = reader.next();
                next = next.replace("\r\n", "");
                next = next.trim();
                index = 0;
                if (!next.matches("\\s*,|]*\\s*")) {
                    split = next.split(",");

                    for (String unparsedFields : split) {
                        fields.get(index).setVal(unparsedFields.split(":")[1]);
                        index++;
                    }
                    printData(writer);
                }
            }
            writer.close();
            reader.close();
        } catch (FileNotFoundException e) {
            System.err.println("File is not there!");
        }
    }

    @Override
    public void printHead(PrintWriter writer) {
        for (Field field : fields) {
            writer.print(field.getName() + ",");
        }
    }

    @Override
    public void printData(PrintWriter writer) {
        writer.println();
        int length = fields.size();
        for (int i=0;i<length;i++) {
            writer.print(fields.get(i).getVal() + ",");
        }
    }

}

public class Main {

    public static void main(String[] args) {
        Json json = new Json();
        json.convert("convertor.in", "convertor.out");
    }
}