1 package org.catacomb.numeric.data; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.util.StringTokenizer; 7 8 import org.catacomb.report.E; 9 10 public class AsciiIO { 11 12 public static DataTable readTable(File f) { 13 DataTable ret = null; 14 15 int ncol = 0; 16 17 boolean doneHeadings = false; 18 if (f.exists()) { 19 ret = new DataTable(); 20 ret.setID(f.getName()); 21 22 try { 23 BufferedReader br = new BufferedReader(new FileReader(f)); 24 while (br.ready()) { 25 String line = br.readLine(); 26 line = line.trim(); 27 if (line.length() > 0) { 28 29 StringTokenizer st = new StringTokenizer(line, " ,;\t"); 30 if (ncol == 0) { 31 ncol = st.countTokens(); 32 ret.setNColumn(ncol); 33 } 34 35 if (st.countTokens() < ncol) { 36 E.warning("too few elements in row - skipping " + line); 37 } else { 38 if (st.countTokens() > ncol) { 39 E.warning("extra tokens in line beyond " + ncol + "? " + line); 40 } 41 42 if (line.startsWith("#")) { 43 if (!doneHeadings) { 44 st = new StringTokenizer(line, " ,;\t"); 45 String[] sa = readStringRow(st, ncol); 46 ret.setHeadings(sa); 47 doneHeadings = true; 48 } 49 50 } else { 51 double[] da = readRow(st, ncol); 52 53 if (da == null) { 54 E.info("Scrapping " + line); 55 } else { 56 ret.addRow(da); 57 } 58 } 59 60 } 61 62 } 63 } 64 } catch (Exception ex) { 65 E.warning("file read exception for " + f + " " + ex); 66 ex.printStackTrace(); 67 } 68 69 70 } else { 71 E.warning("no such file " + f); 72 } 73 if (ret != null) { 74 ret.close(); 75 } 76 return ret; 77 } 78 79 80 81 82 public static double[] readRow(StringTokenizer st, int ncol) { 83 double[] ret = new double[ncol]; 84 try { 85 for (int i = 0; i < ret.length; i++) { 86 ret[i] = Double.parseDouble(st.nextToken()); 87 } 88 } catch (Exception ex) { 89 ret = null; 90 } 91 return ret; 92 } 93 94 95 96 public static String[] readStringRow(StringTokenizer st, int ncol) { 97 String[] ret = new String[ncol]; 98 if (st.countTokens() < ncol) { 99 E.error("need " + ncol + " but got only " + st.countTokens() + " tokens in " + st); 100 } else { 101 for (int i = 0; i < ncol; i++) { 102 ret[i] = st.nextToken(); 103 } 104 } 105 return ret; 106 } 107 108 109 110 111 public static double[] readRow(String line) { 112 StringTokenizer st = new StringTokenizer(line, " ,;\t[]"); 113 int nc = st.countTokens(); 114 return readRow(st, nc); 115 } 116 117 }