/* * Copyright(C)2005 PoisonSoft * All rights reserved. */ import java.io.BufferedWriter; import java.io.IOException; import java.io.Writer; import java.util.List; public class CsvWriter { // 出力先 private BufferedWriter writer; /** * コンストラクタ * @param writer 書き先 */ public CsvWriter(Writer writer) { this.writer = new BufferedWriter(writer); } /** * 出力にそのまま1行書きます。自動的に行末文字を付加します。 * @param 出力文字列。 */ public void write(String line) throws IOException { // nullならば何もしない if (line == null) { return; } writer.write(line); writer.newLine(); } /** * 出力にCSVの1行を書きます。必要な文字のエスケープを * 行い、行末文字も付加します。 * @param cells 各セルの値。ダブルクォートやコンマを含んでいても構いません。 */ public void write(List cells) throws IOException { // nullか、値が無ければ何もしない if (cells == null || cells.size() == 0) { return; } // 一旦バッファに書き出しておく StringBuffer lineBuffer = new StringBuffer(); for (String value : cells) { String escaped = escapeValue(value); lineBuffer.append(escaped); lineBuffer.append(','); } // 末端に余分なコンマがあるので、取り除く int len = lineBuffer.length(); lineBuffer.delete(len - 1, len); // 書き出す writer.write(new String(lineBuffer)); writer.newLine(); } /** * 文字列内にコンマ、ダブルクォート、\n、\rのいずれかが含まれて * いる場合、全体をダブルクォートで囲みます。 * 値のダブルクォートは連続する2つのダブルクォートに変換します。 * \rは取り除きます。 * @param value 対象文字列 */ private String escapeValue(String value) { StringBuffer buffer = new StringBuffer(); boolean needsEscape = false; int len = value.length(); for (int i = 0; i < len; i++) { char c = value.charAt(i); switch (c) { case ',': case '\n': needsEscape = true; buffer.append(c); break; case '"': needsEscape = true; buffer.append("\"\""); break; case '\r': needsEscape = true; break; default: buffer.append(c); } } if (needsEscape) { return "\"" + new String(buffer) + "\""; } else { return new String(buffer); } } /** * 出力をフラッシュします。 */ public void flush() throws IOException { writer.flush(); } /** * 出力をクローズします。 */ public void close() throws IOException { writer.close(); } } // end of file