1 package baseCode.io.reader;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileInputStream;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.io.InputStreamReader;
9 import java.util.StringTokenizer;
10 import java.util.Vector;
11
12 import baseCode.dataStructure.matrix.NamedMatrix;
13 import baseCode.dataStructure.matrix.StringMatrix2DNamed;
14
15 /***
16 * Reader for {@link baseCode.dataStructure.matrix.StringMatrix2DNamed}
17 * <p>
18 * Copyright (c) 2004
19 * </p>
20 * <p>
21 * Institution:: Columbia University
22 * </p>
23 *
24 * @author Paul Pavlidis
25 * @version $Id: StringMatrixReader.java,v 1.3 2004/08/11 22:53:43 pavlidis Exp $
26 */
27 public class StringMatrixReader extends AbstractNamedMatrixReader {
28
29 public NamedMatrix read( String filename ) throws IOException {
30 File infile = new File( filename );
31 if ( !infile.exists() || !infile.canRead() ) {
32 throw new IllegalArgumentException( "Could not read from " + filename );
33 }
34 FileInputStream stream = new FileInputStream( infile );
35 return read( stream );
36 }
37
38 /***
39 * Missing values are entered as an empty string.
40 *
41 * @param stream InputStream
42 * @return NamedMatrix
43 * @throws IOException
44 */
45 public NamedMatrix read( InputStream stream ) throws IOException {
46 StringMatrix2DNamed matrix = null;
47 Vector MTemp = new Vector();
48 Vector rowNames = new Vector();
49 Vector columnNames;
50 BufferedReader dis = new BufferedReader( new InputStreamReader( stream ) );
51
52 int columnNumber = 0;
53 int rowNumber = 0;
54 String row;
55
56 columnNames = readHeader( dis );
57 int numHeadings = columnNames.size();
58
59 while ( ( row = dis.readLine() ) != null ) {
60 StringTokenizer st = new StringTokenizer( row, "\t", true );
61 Vector rowTemp = new Vector();
62 columnNumber = 0;
63 String previousToken = "";
64
65 while ( st.hasMoreTokens() ) {
66 String s = st.nextToken();
67
68 boolean missing = false;
69
70 if ( s.compareTo( "\t" ) == 0 ) {
71
72 if ( previousToken.compareTo( "\t" ) == 0 ) {
73 missing = true;
74 } else if ( !st.hasMoreTokens() ) {
75 missing = true;
76 } else {
77 previousToken = s;
78 continue;
79 }
80 }
81
82 if ( columnNumber > 0 ) {
83 if ( missing ) {
84
85 rowTemp.add( "" );
86 } else {
87 rowTemp.add( s );
88 }
89 } else {
90 if ( missing ) {
91 throw new IOException(
92 "Missing values not allowed for row labels" );
93 }
94 rowNames.add( s );
95 }
96
97 columnNumber++;
98 previousToken = s;
99 }
100 MTemp.add( rowTemp );
101 if ( rowTemp.size() > numHeadings ) {
102 throw new IOException( "Warning: too many values ("
103 + rowTemp.size() + ") in row " + rowNumber
104 + " (based on headings count of " + numHeadings + ")" );
105 }
106 rowNumber++;
107 }
108
109 matrix = new StringMatrix2DNamed( rowNumber, numHeadings );
110 matrix.setColumnNames( columnNames );
111 matrix.setRowNames( rowNames );
112
113 for ( int i = 0; i < matrix.rows(); i++ ) {
114 for ( int j = 0; j < matrix.columns(); j++ ) {
115 if ( ( ( Vector ) MTemp.get( i ) ).size() < j + 1 ) {
116 matrix.set( i, j, "" );
117
118 } else {
119 matrix.set( i, j, ( ( Vector ) MTemp.get( i ) ).get( j ) );
120 }
121 }
122 }
123 stream.close();
124 return matrix;
125
126 }
127
128
129
130
131 public NamedMatrix readOneRow( BufferedReader dis ) throws IOException {
132 throw new UnsupportedOperationException();
133 }
134 }