KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > data > io > CSVTableReader


1 package prefuse.data.io;
2
3 import java.io.BufferedReader JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.io.InputStream JavaDoc;
6 import java.io.InputStreamReader JavaDoc;
7
8 import prefuse.data.parser.DataParseException;
9 import prefuse.data.parser.ParserFactory;
10
11 /**
12  * TableReader for Comma Separated Value (CSV) files. CSV files list
13  * each row of a table on a line, separating each data column by a line.
14  * Typically the first line of the file is a header row indicating the
15  * names of each data column.
16  *
17  * For a more in-depth description of the CSV format, please see this
18  * <a HREF="http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm">
19  * CSV reference web page</a>.
20  *
21  * @author <a HREF="http://jheer.org">jeffrey heer</a>
22  */

23 public class CSVTableReader extends AbstractTextTableReader {
24
25     /**
26      * Create a new CSVTableReader.
27      */

28     public CSVTableReader() {
29         super();
30     }
31     
32     /**
33      * Create a new CSVTableReader.
34      * @param parserFactory the ParserFactory to use for parsing text strings
35      * into table values.
36      */

37     public CSVTableReader(ParserFactory parserFactory) {
38         super(parserFactory);
39     }
40     
41     /**
42      * @see prefuse.data.io.AbstractTextTableReader#read(java.io.InputStream, prefuse.data.io.TableReadListener)
43      */

44     public void read(InputStream JavaDoc is, TableReadListener trl)
45         throws IOException JavaDoc, DataParseException
46     {
47         String JavaDoc line;
48         StringBuffer JavaDoc sbuf = new StringBuffer JavaDoc();
49         
50         boolean inRecord = false;
51         int inQuote = 0;
52         int lineno = 0;
53         int col = 0;
54         
55         BufferedReader JavaDoc br = new BufferedReader JavaDoc(new InputStreamReader JavaDoc(is));
56         while ( (line=br.readLine()) != null ) {
57             // increment the line number
58
++lineno;
59             
60             // extract the character array for quicker processing
61
char[] c = line.toCharArray();
62             int last = c.length-1;
63             
64             // iterate through current line
65
for ( int i=0; i<=last; ++i ) {
66                 if ( !inRecord ) {
67                     // not currently processing a record
68
if ( Character.isWhitespace(c[i]) )
69                     {
70                         continue;
71                     }
72                     else if ( c[i] == '\"' )
73                     {
74                         inRecord = true;
75                         inQuote = 1;
76                     }
77                     else if ( c[i] == ',' )
78                     {
79                         String JavaDoc s = sbuf.toString().trim();
80                         trl.readValue(lineno, ++col, s);
81                         sbuf.delete(0, sbuf.length());
82                     }
83                     else
84                     {
85                         inRecord = true;
86                         sbuf.append(c[i]);
87                     }
88                 } else {
89                     // in the midst of a record
90
if ( inQuote == 1 ) {
91                         if ( c[i]=='\"' && (i==last || c[i+1] != '\"') )
92                         {
93                             // end of quotation
94
inQuote = 2;
95                         }
96                         else if ( c[i]=='\"' )
97                         {
98                             // double quote so skip one ahead
99
sbuf.append(c[i++]);
100                         }
101                         else
102                         {
103                             sbuf.append(c[i]);
104                         }
105                     } else {
106                         if ( Character.isWhitespace(c[i]) )
107                         {
108                             sbuf.append(c[i]);
109                         }
110                         else if ( c[i] != ',' && inQuote == 2 )
111                         {
112                             throw new IllegalStateException JavaDoc(
113                                 "Invalid data format. " +
114                                 "Error at line " + lineno + ", col " + i);
115                         }
116                         else if ( c[i] != ',' )
117                         {
118                             sbuf.append(c[i]);
119                         }
120                         else
121                         {
122                             String JavaDoc s = sbuf.toString().trim();
123                             trl.readValue(lineno, ++col, s);
124                             sbuf.delete(0, sbuf.length());
125                             inQuote = 0;
126                             inRecord = false;
127                         }
128                     }
129                 }
130             }
131             if ( inQuote != 1 ) {
132                 String JavaDoc s = sbuf.toString().trim();
133                 trl.readValue(lineno, ++col, s);
134                 sbuf.delete(0, sbuf.length());
135                 inQuote = 0;
136                 inRecord = false;
137             }
138             if ( !inRecord && col > 0 ) {
139                 col = 0;
140             }
141         }
142     }
143     
144 } // end of class CSVTableReader
145
Popular Tags