/**
*
*/
package org.voyanttools.trombone.model.table;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import edu.stanford.nlp.util.ArrayUtils;
import edu.stanford.nlp.util.StringUtils;
/**
* @author sgs
*
*/
public class Table implements Serializable {
public enum Format {
tsv;
public static Format getForgivingly(String format) {
String formatlower = format.toLowerCase();
for (Format f : Format.values()) {
if (f.name().equals(formatlower)) {return f;}
}
return tsv;
}
};
String[][] values = new String[0][0];
Map<String, Integer> columnsMap = new HashMap<String, Integer>();
Map<String, Integer> rowsMap = new HashMap<String, Integer>();
/**
*
*/
public static final long serialVersionUID = 8047193666708200784L;
public Table(String string, Format format, boolean columnHeaders, boolean rowHeaders) {
String[] lines = string.split("\n");
for (int i=0; i<lines.length; i++) {
String[] cols = lines[i].split("\t");
if (i==0) {
// this assumes that the first row has the maximum number of columns filled
values = new String[columnHeaders ? lines.length-1 : lines.length][rowHeaders ? cols.length-1 : cols.length];
if (columnHeaders) {
for (int j=rowHeaders ? 1 : 0; j<cols.length; j++) {
columnsMap.put(cols[j], j);
}
}
}
if (i>0 || (i==0 && !columnHeaders)) {
if (rowHeaders) {
rowsMap.put(cols[0], columnHeaders ? i-1 : i);
}
for (int j=rowHeaders ? 1 : 0; j<cols.length; j++) {
values[columnHeaders ? i-1 : i][rowHeaders ? j-1 : j] = cols[j];
}
}
}
}
public static String getSerializedId(String id) {
return Table.class.toString()+"-"+Table.serialVersionUID+"-"+id;
}
public String toTsv() {
StringBuilder tsv = new StringBuilder();
if (!columnsMap.isEmpty()) {
String[] cols = new String[columnsMap.size()];
for (Map.Entry<String, Integer> entry : columnsMap.entrySet()) {
cols[entry.getValue()] = entry.getKey();
}
if (!rowsMap.isEmpty()) {
tsv.append("\t");
}
tsv.append(StringUtils.join(cols, "\t")).append("\n");
}
for (String[] vals : values) {
if (!rowsMap.isEmpty()) {
tsv.append("\t");
}
tsv.append(StringUtils.join(vals,"\t")).append("\n");
}
return tsv.toString().substring(0, tsv.length()-1);
}
public String[] getColumn(String column) {
return getColumn(StringUtils.isNumeric(column) ? Integer.parseInt(column) : columnsMap.get(column));
}
public String[] getColumn(int column) {
String[] vals = new String[values.length];
for (int i=0; i<vals.length; i++) {
vals[i] = values[i][column];
}
return vals;
}
public double[] getColumnAsDoubles(String column) {
return ArrayUtils.toDoubleArray(getColumn(column));
}
public double[] getColumnAsDoubles(int column) {
return ArrayUtils.toDoubleArray(getColumn(column));
}
public int getColumnsCount() {
return values[0].length;
}
// public double[] getColumnAsDoubles(int index) {
//
// }
//
// public List<Object> getColumn(String key) {
//
// }
}