From 86f4e9c75951153ae9825f4772633e45698cb602 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Sun, 16 Dec 2018 21:21:43 -0500 Subject: [PATCH] Timeflow clean-up. --- timeflow/format/file/TimeflowFormat.java | 301 ++++++++++++++++++++++++++----------------------- 1 files changed, 159 insertions(+), 142 deletions(-) diff --git a/timeflow/format/file/TimeflowFormat.java b/timeflow/format/file/TimeflowFormat.java index 3778235..50310d0 100755 --- a/timeflow/format/file/TimeflowFormat.java +++ b/timeflow/format/file/TimeflowFormat.java @@ -13,151 +13,168 @@ public class TimeflowFormat implements Import, Export { - private static final String END_OF_SCHEMA="#TIMEFLOW\tend-metadata"; - private static final String END_OF_METADATA="#TIMEFLOW\t====== End of Header. Data below is in tab-delimited format. ====="; - public ActDB readFile(String fileName, PrintStream messages) throws Exception - { - return read(new File(fileName), messages); - } - - public static ActDB read(File file, PrintStream out) throws Exception - { - String text=IO.read(file.getAbsolutePath()); - DelimitedText quote=new DelimitedText('\t'); - Iterator<String[]> lines=quote.read(text).iterator(); - - ActDB db=null; - List<String> fieldNames=new ArrayList<String>(); - List<Class> fieldTypes=new ArrayList<Class>(); - List<Integer> fieldSizes=new ArrayList<Integer>(); - String source="[unknown]", description=""; - for (;;) - { - String[] t=lines.next(); + private static final String END_OF_SCHEMA = "#TIMEFLOW\tend-metadata"; + private static final String END_OF_METADATA = "#TIMEFLOW\t====== End of Header. Data below is in tab-delimited format. ====="; - if (t[1].equals("field")) - { - fieldNames.add(t[2]); - fieldTypes.add(FieldFormatCatalog.javaClass(t[3])); - if (t.length>4) - { - fieldSizes.add(Integer.parseInt(t[4])); - } - else - fieldSizes.add(-1); - } - else if (t[1].equals("source")) - { - source=t[2]; - } - else if (t[1].equals("description")) - { - description=t[2]; - - } - else if (t[1].equals("end-metadata")) - break; - } - db=new ArrayDB((String[])fieldNames.toArray(new String[0]), - (Class[])fieldTypes.toArray(new Class[0]), source); - db.setDescription(description); - for (int i=0; i<fieldNames.size(); i++) - if (fieldSizes.get(i)>0) - db.getField(fieldNames.get(i)).setRecommendedSize(fieldSizes.get(i)); - for (;;) - { - String[] t=lines.next(); - if (t[1].startsWith("===")) - break; - if (t[1].equals("alias")) - db.setAlias(db.getField(t[3]), t[2]); - } - - // note: in some cases headers may be in a different order than in - // metadata section, so we will read these. - String[] headers=lines.next(); - if (headers.length!=fieldNames.size()) - throw new IllegalArgumentException("Different number of headers than fields!"); - - - while (lines.hasNext()) - { - String[] t=lines.next(); - Act a=db.createAct(); - for (int i=0; i<t.length; i++) - { - Field f=db.getField(headers[i]); - FieldFormat format=FieldFormatCatalog.getFormat(f.getType()); - a.set(f, format.parse(t[i])); - } - } - - return db; - } - - public static void write(ActList acts, BufferedWriter bw) throws IOException - { - ActDB db=acts.getDB(); - - PrintWriter out=new PrintWriter(bw); - - DelimitedText tab=new DelimitedText('\t'); - - // Write version - out.println("#TIMEFLOW\tformat version\t1"); - - // Write source of data. - out.println("#TIMEFLOW\tsource\t"+tab.write(db.getSource())); - - // Write description of data. - out.println("#TIMEFLOW\tdescription\t"+tab.write(db.getDescription())); - - // Write schema. - List<Field> fields=db.getFields(); - for (Field f: fields) - { - String recSize=f.getRecommendedSize()<=0 ? "" : "\t"+f.getRecommendedSize(); - out.println("#TIMEFLOW\tfield\t"+tab.write(f.getName())+ - "\t"+FieldFormatCatalog.humanName(f.getType())+recSize); - } - - out.println(END_OF_SCHEMA); - - // Write column mappings. - List<String> aliases=DBUtils.getFieldAliases(db); - for (String a:aliases) - out.println("#TIMEFLOW\talias\t"+a+"\t"+tab.write(db.getField(a).getName())); - - // Write end of header indicator - out.println(END_OF_METADATA); - - // Write data! - new DelimitedFormat('\t').writeDelimited(db, acts, out); - - out.flush(); - out.close(); - } - - public static void main(String[] args) throws Exception - { - System.out.println("Reading"); - ActDB db=read(new File("test/monet.txt"), System.out); - System.out.println("# lines: "+db.size()); - } + public ActDB readFile(String fileName, PrintStream messages) throws Exception + { + return read(new File(fileName), messages); + } - @Override - public String getName() { - return "TimeFlow Format"; - } + public static ActDB read(File file, PrintStream out) throws Exception + { + String text = IO.read(file.getAbsolutePath()); + DelimitedText quote = new DelimitedText('\t'); + Iterator<String[]> lines = quote.read(text).iterator(); - @Override - public ActDB importFile(File file) throws Exception { - return read(file, System.out); - } - @Override - public void export(TFModel model, BufferedWriter out) throws Exception { - write(model.getDB().all(), out); - } + ActDB db = null; + List<String> fieldNames = new ArrayList<String>(); + List<Class> fieldTypes = new ArrayList<Class>(); + List<Integer> fieldSizes = new ArrayList<Integer>(); + String source = "[unknown]", description = ""; + for (;;) + { + String[] t = lines.next(); + + if (t[1].equals("field")) + { + fieldNames.add(t[2]); + fieldTypes.add(FieldFormatCatalog.javaClass(t[3])); + if (t.length > 4) + { + fieldSizes.add(Integer.parseInt(t[4])); + } else + { + fieldSizes.add(-1); + } + } else if (t[1].equals("source")) + { + source = t[2]; + } else if (t[1].equals("description")) + { + description = t[2]; + + } else if (t[1].equals("end-metadata")) + { + break; + } + } + db = new ArrayDB((String[]) fieldNames.toArray(new String[0]), + (Class[]) fieldTypes.toArray(new Class[0]), source); + db.setDescription(description); + for (int i = 0; i < fieldNames.size(); i++) + { + if (fieldSizes.get(i) > 0) + { + db.getField(fieldNames.get(i)).setRecommendedSize(fieldSizes.get(i)); + } + } + for (;;) + { + String[] t = lines.next(); + if (t[1].startsWith("===")) + { + break; + } + if (t[1].equals("alias")) + { + db.setAlias(db.getField(t[3]), t[2]); + } + } + + // note: in some cases headers may be in a different order than in + // metadata section, so we will read these. + String[] headers = lines.next(); + if (headers.length != fieldNames.size()) + { + throw new IllegalArgumentException("Different number of headers than fields!"); + } + + + while (lines.hasNext()) + { + String[] t = lines.next(); + Act a = db.createAct(); + for (int i = 0; i < t.length; i++) + { + Field f = db.getField(headers[i]); + FieldFormat format = FieldFormatCatalog.getFormat(f.getType()); + a.set(f, format.parse(t[i])); + } + } + + return db; + } + + public static void write(ActList acts, BufferedWriter bw) throws IOException + { + ActDB db = acts.getDB(); + + PrintWriter out = new PrintWriter(bw); + + DelimitedText tab = new DelimitedText('\t'); + + // Write version + out.println("#TIMEFLOW\tformat version\t1"); + + // Write source of data. + out.println("#TIMEFLOW\tsource\t" + tab.write(db.getSource())); + + // Write description of data. + out.println("#TIMEFLOW\tdescription\t" + tab.write(db.getDescription())); + + // Write schema. + List<Field> fields = db.getFields(); + for (Field f : fields) + { + String recSize = f.getRecommendedSize() <= 0 ? "" : "\t" + f.getRecommendedSize(); + out.println("#TIMEFLOW\tfield\t" + tab.write(f.getName()) + + "\t" + FieldFormatCatalog.humanName(f.getType()) + recSize); + } + + out.println(END_OF_SCHEMA); + + // Write column mappings. + List<String> aliases = DBUtils.getFieldAliases(db); + for (String a : aliases) + { + out.println("#TIMEFLOW\talias\t" + a + "\t" + tab.write(db.getField(a).getName())); + } + + // Write end of header indicator + out.println(END_OF_METADATA); + + // Write data! + new DelimitedFormat('\t').writeDelimited(db, acts, out); + + out.flush(); + out.close(); + } + + public static void main(String[] args) throws Exception + { + System.out.println("Reading"); + ActDB db = read(new File("test/monet.txt"), System.out); + System.out.println("# lines: " + db.size()); + } + + @Override + public String getName() + { + return "TimeFlow Format"; + } + + @Override + public ActDB importFile(File file) throws Exception + { + return read(file, System.out); + } + + @Override + public void export(TimeflowModel model, BufferedWriter out) throws Exception + { + write(model.getDB().all(), out); + } } -- Gitblit v1.6.2