package com.andreasfink.utils.text;
import java.io.PrintWriter;
import java.io.Writer;
/**
* A very stripped down version of this <a href="http://javacsv.sourceforge.net/com/csvreader/CsvWriter.html">com.csvreader.CsvWriter</a>.<br/>
* The text-quoting is always <code>"</code>.<br/>
*
* You write every single cell with <code>write(String content)</code> and end the row with <code>endRecord()</code>.<br/>
* Get the CSV from the supplied writer's {@link java.io.Writer toString()} and call <code>close()</code> afterwards.
*
* @author af@andreasfink.com
*
*/
public class CsvWriter {
private final PrintWriter writer;
private final char delimiter;
private final char textQualifier = '"';
boolean firstColumn;
public CsvWriter(final Writer writer, final char delimiter) {
this.writer = new PrintWriter(writer);
this.delimiter = delimiter;
firstColumn = true;
}
public void write(String content) {
if (null == content) {
content = "";
}
if (!firstColumn) {
writer.write(delimiter);
}
if (content.length() > 0) {
content = content.trim();
}
boolean textQualify = false;
if (!textQualify
&& (content.indexOf(textQualifier) > -1
|| content.indexOf(delimiter) > -1
|| (content.indexOf('\n') > -1 || content.indexOf('\r') > -1)
|| (firstColumn && content.length() > 0 && content.charAt(0) == '#') ||
// check for empty first column, which if on its own line must
// be qualified or the line will be skipped
(firstColumn && content.length() == 0))) {
textQualify = true;
}
if (!textQualify && content.length() > 0) {
char firstLetter = content.charAt(0);
if (firstLetter == ' ' || firstLetter == '\t') {
textQualify = true;
}
if (!textQualify && content.length() > 1) {
char lastLetter = content.charAt(content.length() - 1);
if (lastLetter == ' ' || lastLetter == '\t') {
textQualify = true;
}
}
}
if (textQualify) {
writer.write(textQualifier);
content = replace(content, "" + textQualifier, "" + textQualifier + textQualifier);
}
writer.write(content);
if (textQualify) {
writer.write(textQualifier);
}
firstColumn = false;
}
public void endRecord() {
writer.println();
firstColumn = true;
}
public void close() {
writer.flush();
writer.close();
}
private String replace(final String original, final String pattern, final String replace) {
final int len = pattern.length();
int found = original.indexOf(pattern);
if (found > -1) {
final StringBuffer sb = new StringBuffer();
int start = 0;
while (found != -1) {
sb.append(original.substring(start, found));
sb.append(replace);
start = found + len;
found = original.indexOf(pattern, start);
}
sb.append(original.substring(start));
return sb.toString();
} else {
return original;
}
}
}