//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.jobs.interactions.io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opencsv.CSVWriter;
import uk.gov.dstl.baleen.jobs.interactions.data.InteractionDefinition;
/**
* Writes interaction data to a CSV file.
* <p>
* The column format is Type, Subtype, Source type, Target type, Lemma, Lemma POS, Alternatives....
* where the 'alternatives' is a list of words which could stand in for the lemma. POS will be
* 'noun', 'verb', 'adverb', 'adjective'.
* <p>
* The CSV file is RFC 4180 compliant.
*
*/
public class CsvInteractionWriter implements InteractionWriter {
private static final Logger LOGGER = LoggerFactory.getLogger(CsvInteractionWriter.class);
private final String csvFilename;
private CSVWriter writer;
/**
* Instantiates a new csv interaction writer.
*
* @param csvFilename
* the csv filename
*/
public CsvInteractionWriter(String csvFilename) {
this.csvFilename = csvFilename;
}
@Override
public void initialise() throws IOException {
// Create the parent dirs
new File(csvFilename).getAbsoluteFile().getParentFile().mkdirs();
writer = new CSVWriter(new FileWriter(csvFilename, false), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
// Print the header
writer.writeNext(new String[] {
"Type",
"Subtype",
"Source type",
"Target type",
"Lemma",
"Lemma POS",
"Alternatives...."
});
}
@Override
public void write(InteractionDefinition interaction, Collection<String> alternatives) throws IOException {
if (writer != null) {
final String[] record = new String[6 + alternatives.size()];
record[0] = interaction.getType();
record[1] = interaction.getSubType();
record[2] = interaction.getSource();
record[3] = interaction.getTarget();
record[4] = interaction.getWord().getLemma();
record[5] = interaction.getWord().getPos().getLabel();
final Iterator<String> iterator = alternatives.iterator();
for (int i = 0; i < alternatives.size(); i++) {
record[6 + i] = iterator.next();
}
writer.writeNext(record);
}
}
@Override
public void destroy() {
try {
if (writer != null) {
writer.flush();
writer.close();
}
} catch (final Exception e) {
LOGGER.warn("Unable to close the CSV writer", e);
writer = null;
}
}
}