package com.walker.di.univocity; import com.univocity.parsers.common.processor.ObjectRowWriterProcessor; import com.univocity.parsers.csv.CsvWriter; import com.univocity.parsers.csv.CsvWriterSettings; import com.walker.di.AbstractErrorWriter; import com.walker.di.Constants; import com.walker.infrastructure.utils.KeyValue; import java.io.IOException; import java.io.OutputStream; import java.util.List; /** * CSV方式实现的错误记录器。 * @author 时克英 * @date 2023-02-02 */ public class CsvErrorWriter extends AbstractErrorWriter { private CsvWriter writer = null; private OutputStream outputStream = null; public CsvErrorWriter(OutputStream outputStream, List fieldNames){ this.outputStream = outputStream; // 加入最后一列: 错误原因 String[] columns = this.cloneColumns(fieldNames); final CsvWriterSettings csvWriterSettings = new CsvWriterSettings(); csvWriterSettings.setHeaderWritingEnabled(Boolean.TRUE); csvWriterSettings.setRowWriterProcessor(new ObjectRowWriterProcessor()); csvWriterSettings.setHeaders(columns); writer = new CsvWriter(outputStream, csvWriterSettings); } @Override // public void write(Map data, String error) { public void write(List> data, String error) { if(writer != null){ // data.put(Constants.ERROR_COLUMN_NAME, error); data.add(new KeyValue<>(Constants.ERROR_COLUMN_NAME, error)); // // 数据转 Map // Map map = new HashMap<>(); // for(KeyValue kv : data){ // map.put(kv.getKey(), kv.getValue()); // } // this.writer.processRecord(data); this.writer.processRecord(this.toMap(data)); logger.debug("error = " + data); } else { logger.warn("writer不存在"); } } @Override public void close() { if(this.writer != null){ this.writer.close(); } if(this.outputStream != null){ try { this.outputStream.close(); } catch (IOException e) {} } } }