package jeql.command.io;
import java.io.IOException;
import java.io.Writer;
import jeql.api.row.Row;
import jeql.api.row.RowIterator;
import jeql.api.row.RowSchema;
import jeql.api.table.Table;
import jeql.util.NumberUtil;
import jeql.util.SystemUtil;
import jeql.util.TypeUtil;
import com.vividsolutions.jts.geom.Geometry;
public class CSVWriterCommand
extends TableFileWriterCmd
{
public static final String CSV_QUOTE = "\"";
private String colSep = ",";
private String quote = CSV_QUOTE;
private boolean showColNames = true;
private boolean isTrim = false;
private boolean isNoquoteNumbers = false;
public static String csvEncode(String s)
{
// double all quotes
return s.replaceAll(CSV_QUOTE, "\"\"");
}
public CSVWriterCommand() {
}
/**
* Normally should not be overridden
*
* @param sep
*/
public void setColSep(String sep) {
this.colSep = sep;
}
public void setQuote(String quote) {
this.quote = quote;
}
public void setColNames(boolean showColNames)
{
this.showColNames = showColNames;
}
public void setTrim(boolean isTrim)
{
this.isTrim = isTrim;
}
public void setNoquoteNumbers(boolean isNoquoteNumbers)
{
this.isNoquoteNumbers = isNoquoteNumbers;
}
protected void write(Table tbl) throws IOException
{
RowIterator rs = tbl.getRows().iterator();
writer = getWriter();
if (showColNames) {
writeColNames(writer, rs.getSchema());
}
while (true) {
Row row = rs.next();
if (row == null)
break;
writeRow(writer, row);
}
writer.close();
}
private void writeColNames(Writer writer, RowSchema schema)
throws IOException
{
for (int i = 0; i < schema.size(); i++ ) {
if (i > 0) writer.write(colSep);
writer.write(schema.getName(i));
}
writer.write(SystemUtil.LINE_TERM);
}
private void writeRow(Writer writer, Row row) throws IOException {
for (int i = 0; i < row.size(); i++) {
if (i > 0) writer.write(colSep);
writeValue(writer, row.getValue(i));
}
writer.write(SystemUtil.LINE_TERM);
}
private void writeValue(Writer writer, Object val)
throws IOException {
if (val == null) {
// don't write out anything for null values
}
else if (val instanceof String) {
writeString(writer, (String) val);
}
else if (val instanceof Geometry) {
writer.write(CSV_QUOTE);
writer.write(val.toString());
writer.write(CSV_QUOTE);
}
else {
writer.write(TypeUtil.toString(val));
}
}
private void writeString(Writer writer, String val) throws IOException
{
String s = (String) val;
if (isTrim) {
s = s.trim();
}
if (isNoquoteNumbers) {
if (NumberUtil.isNumberConvertible(s)) {
writer.write(s);
return;
}
}
writer.write(CSV_QUOTE);
writer.write(csvEncode(s));
writer.write(CSV_QUOTE);
}
}