package com.bizosys.hsearch.loader.csv;
import com.bizosys.oneline.util.StringUtils;
public class CsvWriter {
public static final int INITIAL_STRING_SIZE = 128;
private char separator = ',';
private char escapechar;
private String lineEnd = StringUtils.Empty;
private char quotechar;
/** The quote constant to use when you wish to suppress all quoting. */
public static final char NO_QUOTE_CHARACTER = '\u0000';
/** The escape constant to use when you wish to suppress all escaping. */
public static final char NO_ESCAPE_CHARACTER = '\u0000';
public CsvWriter(char separator) {
this.separator = separator;
this.quotechar = NO_QUOTE_CHARACTER;
this.escapechar = NO_ESCAPE_CHARACTER;
}
public CsvWriter(char separator, char quotechar, char escapechar) {
this.separator = separator;
this.quotechar = quotechar;
this.escapechar = escapechar;
}
/**
* Write a row.
* @param cells
* @param sb
* @return
*/
public String writeRow(String[] cells, StringBuilder sb) {
if (cells == null) return StringUtils.Empty;
sb.delete(0, sb.capacity());
for (int i = 0; i < cells.length; i++) {
if (i != 0) {
sb.append(separator);
}
String nextElement = cells[i];
if (nextElement == null)
continue;
if (quotechar != NO_QUOTE_CHARACTER)
sb.append(quotechar);
sb.append(stringContainsSpecialCharacters(nextElement) ? processRow(nextElement) : nextElement);
if (quotechar != NO_QUOTE_CHARACTER)
sb.append(quotechar);
}
sb.append(lineEnd);
return sb.toString();
}
private boolean stringContainsSpecialCharacters(String line) {
return line.indexOf(quotechar) != -1 || line.indexOf(escapechar) != -1;
}
private StringBuilder processRow(String nextElement)
{
StringBuilder sb = new StringBuilder(INITIAL_STRING_SIZE);
for (int j = 0; j < nextElement.length(); j++) {
char nextChar = nextElement.charAt(j);
if (escapechar != NO_ESCAPE_CHARACTER && nextChar == quotechar) {
sb.append(escapechar).append(nextChar);
} else if (escapechar != NO_ESCAPE_CHARACTER && nextChar == escapechar) {
sb.append(escapechar).append(nextChar);
} else {
sb.append(nextChar);
}
}
return sb;
}
}