前回の続きで、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();
}
}