package prefuse.data.io;
import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import prefuse.data.Table;
import prefuse.util.collections.IntIterator;
/**
* TableWriter that writes out a text table in the comma-separated-values
* format. By default, a header row containing the column names is included
* in the output.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class CSVTableWriter extends AbstractTableWriter {
private boolean m_printHeader;
/**
* Create a new CSVTableWriter that writes comma separated values files.
*/
public CSVTableWriter() {
this(true);
}
/**
* Create a new CSVTableWriter.
* @param printHeader indicates if a header row should be printed
*/
public CSVTableWriter(boolean printHeader) {
m_printHeader = printHeader;
}
// ------------------------------------------------------------------------
/**
* Indicates if this writer will write a header row with the column names.
* @return true if a header row will be printed, false otherwise
*/
public boolean isPrintHeader() {
return m_printHeader;
}
/**
* Sets if this writer will write a header row with the column names.
* @param printHeader true to print a header row, false otherwise
*/
public void setPrintHeader(boolean printHeader) {
m_printHeader = printHeader;
}
// ------------------------------------------------------------------------
/**
* @see prefuse.data.io.TableWriter#writeTable(prefuse.data.Table, java.io.OutputStream)
*/
public void writeTable(Table table, OutputStream os) throws DataIOException {
try {
// get print stream
PrintStream out = new PrintStream(new BufferedOutputStream(os));
// write out header row
if ( m_printHeader ) {
for ( int i=0; i<table.getColumnCount(); ++i ) {
if ( i>0 ) out.print(',');
out.print(makeCSVSafe(table.getColumnName(i)));
}
out.println();
}
// write out data
for ( IntIterator rows = table.rows(); rows.hasNext(); ) {
int row = rows.nextInt();
for ( int i=0; i<table.getColumnCount(); ++i ) {
if ( i>0 ) out.print(',');
String str = table.getString(row, table.getColumnName(i));
out.print(makeCSVSafe(str));
}
out.println();
}
// finish up
out.flush();
} catch ( Exception e ) {
throw new DataIOException(e);
}
}
private String makeCSVSafe(String s) {
int q = -1;
if ( (q=s.indexOf('\"')) >= 0 ||
s.indexOf(',') >= 0 || s.indexOf('\n') >= 0 ||
Character.isWhitespace(s.charAt(0)) ||
Character.isWhitespace(s.charAt(s.length()-1)) )
{
if ( q >= 0 ) s = s.replaceAll("\"", "\"\"");
s = "\""+s+"\"";
}
return s;
}
} // end of class CSVTableWriter