package prefuse.data.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import prefuse.data.parser.DataParseException;
/**
* TableReader for fixed-width text files, that encode one row of table
* data per line use a fixed number of characters for each data column.
* Reading such tables requires use of a schema description that describes
* the fixed-widths for each individual column.
* The {@link prefuse.data.io.FixedWidthTextTableSchema} class provides
* this functionality.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class FixedWidthTextTableReader extends AbstractTextTableReader {
// the schema description
private FixedWidthTextTableSchema m_schema;
/**
* Creates a new FixedWidthTextTableReader using the given schema.
* @param schema the schema description of the fixed-width text column lengths
*/
public FixedWidthTextTableReader(FixedWidthTextTableSchema schema) {
super.setHasHeader(false);
m_schema = schema;
}
/**
* Creates a new FixedWidthTextTableReader using the schema at
* the given location.
* @param location a location string (filename, URL, or resource locator)
* for the schema description of the fixed-width text column lengths
* @throws DataIOException if an IO exception occurs while loading the schema
*/
public FixedWidthTextTableReader(String location) throws DataIOException {
this(FixedWidthTextTableSchema.load(location));
}
// ------------------------------------------------------------------------
/**
* Get the schema description describing the data columns' fixed widths
* @return the fixed-width table schema description
*/
public FixedWidthTextTableSchema getFixedWidthSchema() {
return m_schema;
}
/**
* Set the schema description describing the data columns' fixed widths
* @param schema the fixed-width table schema description
*/
public void setFixedWidthSchema(FixedWidthTextTableSchema schema) {
m_schema = schema;
}
// ------------------------------------------------------------------------
/**
* @see prefuse.data.io.AbstractTextTableReader#read(java.io.InputStream, prefuse.data.io.TableReadListener)
*/
protected void read(InputStream is, TableReadListener trl)
throws IOException, DataParseException
{
String line;
int lineno = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ( (line=br.readLine()) != null ) {
// increment the line number
++lineno;
// split on tab character
for (int i=0; i<m_schema.getColumnCount(); ++i) {
int idx0 = m_schema.getColumnStart(i);
int idx1 = m_schema.getColumnEnd(i);
trl.readValue(lineno, i+1, line.substring(idx0, idx1));
}
}
}
/**
* @see prefuse.data.io.AbstractTextTableReader#getColumnNames()
*/
protected ArrayList getColumnNames() {
ArrayList names = new ArrayList();
for (int i=0; i<m_schema.getColumnCount(); ++i) {
names.add(m_schema.getColumnName(i));
}
return names;
}
} // end of class FixedWidthTextTableReader