001 package org.expasy.jpl.commons.base.io;
002
003
004 import java.io.BufferedReader;
005 import java.io.File;
006 import java.io.FileNotFoundException;
007 import java.io.FileReader;
008 import java.io.IOException;
009 import java.text.ParseException;
010 import java.util.ArrayList;
011 import java.util.StringTokenizer;
012
013
014 public final class TabFileReader implements Parser<File> {
015
016 /** Flag that defines whether header are read */
017 private boolean readHeader;
018 /** Column separator */
019 private String separator;
020 /** Names of columns (can be empty) */
021 private ArrayList<String> columnNames;
022 /** Array of arrays containing values */
023 private ArrayList<ArrayList<Double>> values;
024
025 /**
026 * retrieve new instance
027 *
028 * @return new instance
029 */
030 public static TabFileReader newInstance() {
031 return new TabFileReader();
032 }
033
034 /**
035 * Constructor
036 */
037 public TabFileReader() {
038 readHeader = true;
039 separator = ",";
040 columnNames = null;
041 values = new ArrayList<ArrayList<Double>>();
042 }
043
044 public void parse(File file) throws ParseException {
045 try {
046 BufferedReader bufRdr = new BufferedReader(new FileReader(file));
047 String line = bufRdr.readLine();
048
049 if (line == null) {
050 System.out.println("File " + file.getAbsolutePath()
051 + "is empty");
052 return;
053 }
054
055 if (readHeader) {
056 columnNames = new ArrayList<String>();
057 StringTokenizer st = new StringTokenizer(line, separator);
058 while (st.hasMoreTokens()) {
059 // get next token and store it in the array
060 columnNames.add(st.nextToken());
061 // create value array
062 ArrayList<Double> col = new ArrayList<Double>();
063 values.add(col);
064 }
065 } else {
066 StringTokenizer st = new StringTokenizer(line, separator);
067 while (st.hasMoreTokens()) {
068 ArrayList<Double> col = new ArrayList<Double>();
069 col.add(Double.parseDouble(st.nextToken()));
070 values.add(col);
071 }
072 }
073
074 // read each line of text
075 while ((line = bufRdr.readLine()) != null) {
076 StringTokenizer st = new StringTokenizer(line, separator);
077 int i = 0;
078 while (st.hasMoreTokens()) {
079 // get next token and store it in the array
080 ArrayList<Double> col = values.get(i);
081 col.add(Double.parseDouble(st.nextToken()));
082 i++;
083 }
084 }
085 bufRdr.close();
086 } catch (FileNotFoundException e) {
087 throw new ParseException(e.getMessage(), 1);
088 } catch (IOException e) {
089 throw new ParseException(e.getMessage(), 1);
090 }
091 }
092
093 /**
094 * Get column names. Returns null if no header is read.
095 *
096 * @return column names
097 */
098 public ArrayList<String> getColomnNames() {
099 return columnNames;
100 }
101
102 /**
103 * Get values
104 *
105 * @return values
106 */
107 public ArrayList<ArrayList<Double>> getValues() {
108 return values;
109 }
110
111 /**
112 * Set flag that defines whether to read heather
113 *
114 * @param readHeader flag
115 */
116 public void setReadHeader(boolean readHeader) {
117 this.readHeader = readHeader;
118 }
119
120 /**
121 * Ask whether header line is read
122 *
123 * @return readHeader flag
124 */
125 public boolean doReadHeader() {
126 return readHeader;
127 }
128
129 /**
130 * Set separator
131 *
132 * @param separator Column separator
133 */
134 public void setSeparator(String separator) {
135 this.separator = separator;
136 }
137
138 /**
139 * Get separator
140 *
141 * @return column separator
142 */
143 public String getSeparator() {
144 return separator;
145 }
146
147 }