package timeflow.format.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import timeflow.data.db.Act; import timeflow.data.db.ActDB; import timeflow.data.db.DBUtils; import timeflow.data.db.Field; import timeflow.data.time.RoughTime; import timeflow.model.Display; import timeflow.util.*; public class DelimitedFormat { char delimiter; DelimitedText delimitedText; public DelimitedFormat(char delimiter) { this.delimiter=delimiter; delimitedText=new DelimitedText(delimiter); } public static String[][] readArrayGuessDelim(String fileName, PrintStream messages) throws Exception { //messages.println("DelimitedFormat: reading "+fileName); String text=IO.read(fileName); return readArrayFromString(text, messages); } public static String[][] readArrayFromString(String text, PrintStream messages) throws Exception { //messages.println("DelimitedFormat: reading string, length="+text.length()); int n=Math.min(text.length(), 1000); String beginning=text.substring(0,n); char c=count(beginning, '\t')>count(beginning, ',') ? '\t' : ','; return new DelimitedFormat(c).readTokensFromString(text, messages); } private static String[] removeBlankLines(String[] lines) { List good=new ArrayList(); for (int i=0; i resultList=new ArrayList(); Iterator lines=delimitedText.read(text).iterator(); int numCols=-1; while(lines.hasNext()) { String[] r=lines.next(); int ri=r.length; if (numCols==-1) numCols=r.length; else { if (ri>numCols) { messages.println("Line too long: "+ri+" > "+numCols); messages.println("line="+Display.arrayToString(r)); } else if (ri acts, File file) throws IOException { FileOutputStream fos=new FileOutputStream(file); BufferedOutputStream b=new BufferedOutputStream(fos); PrintStream out=new PrintStream(b); // Write data! writeDelimited(db, acts, out); out.flush(); out.close(); b.close(); fos.close(); } void writeDelimited(ActDB db, PrintStream out) { writeDelimited(db, db, out); } public void writeDelimited(ActDB db, Iterable acts, PrintWriter out) { // Write headers List names=new ArrayList(); List fields=db.getFields(); for (Field f: fields) names.add(f.getName()); print(names, out); // Write data for (Act a: acts) { List data=new ArrayList(); for (Field f: fields) data.add(format(a.get(f))); print(data, out); } } public void writeDelimited(ActDB db, Iterable acts, PrintStream out) { // Write headers List names=new ArrayList(); List fields=db.getFields(); for (Field f: fields) names.add(f.getName()); print(names, out); // Write data for (Act a: acts) { List data=new ArrayList(); for (Field f: fields) data.add(format(a.get(f))); print(data, out); } } static String format(Object o) { if (o==null) return ""; if (o instanceof String) return (String)o; if (o instanceof RoughTime) return ((RoughTime)o).format(); if (o instanceof Number) return o.toString(); if (o instanceof String[]) { return writeArray((String[])o); } return o.toString(); } public static String writeArray(Object[] s) { if (s==null || s.length==0) { return ""; } StringBuffer b=new StringBuffer(); for (int i=0; i0) b.append(","); b.append(s[i]); } return b.toString(); } void print(List list, PrintStream out) { out.println(delimitedText.write((String[])list.toArray(new String[0]))); } void print(List list, PrintWriter out) { out.println(delimitedText.write((String[])list.toArray(new String[0]))); } }