package ilarkesto.io; import ilarkesto.base.Str; import java.io.PrintWriter; import java.io.Writer; import java.util.Collection; import java.util.List; import java.util.Map; public class CsvWriter { private PrintWriter out; private List<String> headers; public CsvWriter(PrintWriter out) { this.out = out; } public CsvWriter(Writer out) { this(new PrintWriter(out)); } public void writeRecord(Map<String, Object> fields) { if (headers == null) throw new IllegalStateException("headers property must be set when to write record values from a map"); for (String header : headers) writeField(fields.get(header)); closeRecord(); } public void writeHeaders(List<String> headers) { setHeaders(headers); writeRecord(headers); } public void setHeaders(List<String> headers) { this.headers = headers; } public void writeRecord(Collection<String> values) { for (String value : values) writeField(value); closeRecord(); } private boolean nl = true; public void writeField(Object value) { if (!nl) { out.print(separator); } nl = false; if (value == null) { // value = ""; return; } out.print('"'); out.print(escape(value.toString())); out.print('"'); } public void closeRecord() { out.print("\r\n"); out.flush(); nl = true; } public static String escape(String value) { value = Str.escapeEscapeSequences(value); return value; } public void close() { out.close(); } // --- dependencies --- private char separator = ','; public void setSeparator(char separator) { this.separator = separator; } }