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    }