1 package prefuse.data.io; 2 3 import java.io.BufferedReader ; 4 import java.io.IOException ; 5 import java.io.InputStream ; 6 import java.io.InputStreamReader ; 7 8 import prefuse.data.parser.DataParseException; 9 import prefuse.data.parser.ParserFactory; 10 11 23 public class CSVTableReader extends AbstractTextTableReader { 24 25 28 public CSVTableReader() { 29 super(); 30 } 31 32 37 public CSVTableReader(ParserFactory parserFactory) { 38 super(parserFactory); 39 } 40 41 44 public void read(InputStream is, TableReadListener trl) 45 throws IOException , DataParseException 46 { 47 String line; 48 StringBuffer sbuf = new StringBuffer (); 49 50 boolean inRecord = false; 51 int inQuote = 0; 52 int lineno = 0; 53 int col = 0; 54 55 BufferedReader br = new BufferedReader (new InputStreamReader (is)); 56 while ( (line=br.readLine()) != null ) { 57 ++lineno; 59 60 char[] c = line.toCharArray(); 62 int last = c.length-1; 63 64 for ( int i=0; i<=last; ++i ) { 66 if ( !inRecord ) { 67 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 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 if ( inQuote == 1 ) { 91 if ( c[i]=='\"' && (i==last || c[i+1] != '\"') ) 92 { 93 inQuote = 2; 95 } 96 else if ( c[i]=='\"' ) 97 { 98 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 ( 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 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 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 } | Popular Tags |