CSV書き込み(2)

前回の続きで、CSV書き込みのインタフェース実装を受け取って処理するもの。

そんなに難しいものではない。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.List;
/**
 * CsvOutStreamProcessor CSV書込みプロセッサ
 */

public class CsvOutStreamProcessor{
   private String charName;
   private String lineSeparator;

   /**
    * コンストラクタ
    */

   public CsvOutStreamProcessor(){
      this.charName = "UTF-8";
      this.lineSeparator = System.getProperty("line.separator");
   }
   /**
    * 文字コード指定コンストラクタ
    * @param charName
    */

   public CsvOutStreamProcessor(String charName){
      this.charName = charName;
      this.lineSeparator = System.getProperty("line.separator");
   }

   /**
    * CSV書込み実行
    * @param os OutputStream
    * @param processor
    * @return 書込み行数
    * @throws IOException
    */

   public int processStream(OutputStream os,CsvLineWriteProcessor processor) throws IOException{
      int lineno=0;
      if (!processor.continueProcessing()) return 0;
      OutputStreamWriter ow = new OutputStreamWriter(os,this.charName);
      List<String> headers = processor.headerLine();
      if (headers != null && headers.size() > 0){
         ow.write(
csvline(headers));
         ow.write(this.lineSeparator);
         ow.flush();
         lineno++;
      }
      int count=1;
      while(true){
         if (!processor.continueProcessing()) break;
         List<String> dataline = processor.dataLine(count);
         if (dataline==null || dataline.size()==0) break;
         ow.write(
csvline(dataline));
         ow.write(this.lineSeparator);
         ow.flush();
         count++;
         lineno++;
      }
      ow.close();
      return lineno;
   }


   public int processStream(File file,CsvLineWriteProcessor processor) throws IOException{
      return this.processStream(new FileOutputStream(file),processor);
   }

   public int processStream(String path,CsvLineWriteProcessor processor) throws IOException{
      return this.processStream(new FileOutputStream(path),processor);
   }

   /**
    * @param s 文字コー指定
    */

   public void setLineSeparator(String s){
      this.lineSeparator = s;
   }

   private String csvline(List<String> list){
      StringBuilder sb = new StringBuilder();
      for(Iterator<String> it=list.iterator();it.hasNext();){
         sb.append("\"");
         sb.append(it.next().replaceAll("\"","\"\""));
         sb.append("\"");
         if (it.hasNext()){
            sb.append(",");
         }
      }
      return sb.toString();
   }

}