package quickml.utlities;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import quickml.data.AttributesMap;
import quickml.data.instances.Instance;
import au.com.bytecode.opencsv.CSVWriter;
import java.io.*;
import java.util.List;
import java.util.Set;
/**
* Created by alexanderhawk on 10/30/14.
*/
public class InstancesToCsvWriter {
public static void writeInstances(List<? extends Instance<AttributesMap, Serializable>> instances, String filePath) {
List<String[]> allRows = Lists.newLinkedList();
String[] header = getHeader(instances);
allRows.add(header);
for (Instance<AttributesMap, Serializable> instance : instances) {
allRows.add(instanceToRow(instance, header));
}
File file = new File(filePath);
Writer writer = null;
try {
writer = new BufferedWriter(new FileWriter(file));
CSVWriter csvWriter = new CSVWriter(writer);
csvWriter.writeAll(allRows);
writer.close();
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
private static String[] getHeader(List<? extends Instance<AttributesMap, Serializable>> instances) {
Set<String> headerSet = Sets.newTreeSet();
for (Instance<AttributesMap, Serializable> instance : instances) {
for (String key : instance.getAttributes().keySet()) {
headerSet.add(key);
}
}
headerSet.add("label");
headerSet.add("weight");
return headerSet.toArray(new String[headerSet.size()]);
}
private static String[] instanceToRow(Instance<AttributesMap, Serializable> instance, String [] header) {
String[] row = new String[header.length];
for (int i = 0; i < header.length; i++) {
if (((String) header[i]).equals("label")) {
row[i] = instance.getLabel().toString();
} else if (((String) header[i]).equals("weight")) {
row[i] = Double.toString(instance.getWeight());
} else {
row[i] = instance.getAttributes().containsKey(header[i]) ? instance.getAttributes().get(header[i]).toString() : "";
}
}
return row;
}
}