Cod sursa(job #1359573)

Utilizator Raz_Van_BarbascuBarbascu Razvan Raz_Van_Barbascu Data 24 februarie 2015 23:39:00
Problema Convertor Scor 70
Compilator java Status done
Runda rosedu_cdl_2015 Marime 3.55 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;

		try {
			writer = new PrintWriter(outputFileName);
			Scanner reader = new Scanner(new FileInputStream(inputFileName));
			reader = reader.useDelimiter("[{}]");
			String next = reader.next();
			if (reader.hasNext()) {
				next = reader.next();
				next = next.replace("\r\n", "");
				next = next.trim();
				if (!next.matches("\\s*,*\\s*")) {
					String[] split = next.split(",");

					for (String s : split) {
						String[] field = s.split(":");
						int index = field[0].indexOf('"') + 1;
						String 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);
				}
			}
			int index;
			while (reader.hasNext()) {

				next = reader.next();
				next = next.replace("\r\n", "");
				next = next.trim();
				index = 0;
				if (!next.matches("\\s*,|]*\\s*")) {
					String[] 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();
		for (Field field : fields) {
			writer.print(field.getVal() + ",");
		}
	}

}

public class Main {

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