package readers;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import processing.core.PApplet;
import utils.Utils;
@SuppressWarnings("serial")
public class LogFileReader extends PApplet {
private static final int HEADER_ROW = 0;
public double[][] indicators;
public int nrow;
public int ncol;
public LogFileReader() {
}
public LogFileReader(String filename, double burnIn, String indicatorName) {
String[] lines = LoadStrings(filename);
nrow = lines.length - 1;
String[] colNames = lines[HEADER_ROW].split("\t");
List<Integer> list = new ArrayList<Integer>();
// Create a pattern to match
Pattern pattern = Pattern.compile(indicatorName);
for (int row = 0; row < colNames.length; row++) {
// Look for matches in column names
Matcher matcher = pattern.matcher(colNames[row]);
if (matcher.find()) {
list.add(row);
}
}
ncol = list.size();
// skip first line with col names and the burn in lines
int delete = (int) (nrow * burnIn) + 1;
indicators = new double[nrow - delete][ncol];
int i = 0;
for (int row = delete; row < nrow; row++) {
String[] line = lines[row].split("\t");
indicators[i] = Utils.parseDouble(Utils.subset(line, list.get(0),
ncol));
i++;
}
indicators = (double[][]) indicators;
nrow = indicators.length;
}// END: ReadLog
public String [] getColNames(String filename) {
// a bit ineffecient to read the complete log file
// TODO: only read to column names line
String[] lines = LoadStrings(filename);
String[] colNames = lines[HEADER_ROW].split("\t");
return colNames;
}
private String[] LoadStrings(String filename) {
InputStream is = createInput(filename);
if (is != null)
return LoadStrings(is);
System.err.println("The file \"" + filename + "\" "
+ "is missing or inaccessible, make sure "
+ "the URL is valid or that the file is readable.");
return null;
}
private String[] LoadStrings(InputStream input) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
input, "UTF-8"));
String lines[] = new String[100];
int lineCount = 0;
String line = null;
while (((line = reader.readLine()) != null)) {
if (lineCount == lines.length) {
String temp[] = new String[lineCount << 1];
System.arraycopy(lines, 0, temp, 0, lineCount);
lines = temp;
}
// suppress commented lines
if (!line.startsWith("#")) {
lines[lineCount++] = line;
}
}
reader.close();
if (lineCount == lines.length) {
return lines;
}
// resize array to appropriate amount for these lines
String output[] = new String[lineCount];
System.arraycopy(lines, 0, output, 0, lineCount);
return output;
} catch (IOException e) {
Utils.handleException(e, "Error when loading strings!");
}
return null;
}
}// END: class