package com.github.minyk.morphlinesmr.commands; import com.github.minyk.morphlinesmr.shaded.com.googlecode.jcsv.CSVStrategy; import com.github.minyk.morphlinesmr.shaded.com.googlecode.jcsv.writer.CSVWriter; import com.github.minyk.morphlinesmr.shaded.com.googlecode.jcsv.writer.internal.CSVWriterBuilder; import com.github.minyk.morphlinesmr.shaded.com.googlecode.jcsv.writer.internal.DefaultCSVEntryConverter; import com.typesafe.config.Config; import org.kitesdk.morphline.api.Command; import org.kitesdk.morphline.api.CommandBuilder; import org.kitesdk.morphline.api.MorphlineContext; import org.kitesdk.morphline.api.Record; import org.kitesdk.morphline.base.AbstractCommand; import java.io.StringWriter; import java.util.Collection; import java.util.Collections; import java.util.List; /** * Created by minyk on 2/3/15. */ public final class WriteCSVBuilder implements CommandBuilder { @Override public Collection<String> getNames() { return Collections.singletonList("writeCSV"); } @Override public Command build(Config config, Command parent, Command child, MorphlineContext context) { return new WriteCSV(this, config, parent, child, context); } private static final class WriteCSV extends AbstractCommand { private final CSVStrategy csvStrategy; private final CSVWriter<String[]> csvWriter; private final StringWriter sw; private final String output_field; private final List<String> input_fields; private final int input_size; private final String[] results; protected WriteCSV(CommandBuilder builder, Config config, Command parent, Command child, MorphlineContext context) { super(builder, config, parent, child, context); char delimiter = getConfigs().getString(config, "delimiter", ",").charAt(0); input_fields = getConfigs().getStringList(config,"inputs"); input_size = input_fields.size(); results = new String[input_size]; output_field = getConfigs().getString(config,"output", "output"); csvStrategy = new CSVStrategy(delimiter, '"', '#', false, false); sw = new StringWriter(); CSVWriterBuilder<String[]> csvWriterBuilder = new CSVWriterBuilder<String[]>(sw); csvWriterBuilder.entryConverter(new DefaultCSVEntryConverter()); csvWriterBuilder.strategy(csvStrategy); csvWriter = csvWriterBuilder.build(); } @Override protected boolean doProcess(Record record) { for (int i=0; i < input_size; i++) { results[i] = (String) record.getFirstValue(input_fields.get(i)); } record.getFields().put(output_field, csvWriter.writeString(results)); return super.doProcess(record); } } }