package nl.wldelft.timeseriesparsers;

import nl.wldelft.util.TextUtils;
import nl.wldelft.util.io.LineReader;
import nl.wldelft.util.io.TextParser;
import nl.wldelft.util.timeseries.DefaultTimeSeriesHeader;
import nl.wldelft.util.timeseries.TimeSeriesContentHandler;

/**
 * Parser for Dino GWS data
 */
public class DinoTimeSeriesParser implements TextParser<TimeSeriesContentHandler> {
    @Override
    public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws Exception {
        DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader();
        header.setCurrentReader(reader);

        String[] columnNames = null;
        String[] buffer = null;
        char columnSeparator = '\0';
        int headerIndex = -1;

        for (String line;  (line = reader.readLine()) != null;) {
            if (columnSeparator == '\0') {
                if (line.indexOf(',') != -1) columnSeparator = ',';
                if (line.indexOf(';') != -1) columnSeparator = ';';
                if (columnSeparator == '\0') continue;
            }

            if (TextUtils.leftFrom(line, columnSeparator).trim().equalsIgnoreCase("Locatie")) {
                columnNames =  TextUtils.splitString(line, columnSeparator);
                TextUtils.trimElements(columnNames);
                buffer = new String[columnNames.length];
                headerIndex++;
                continue;
            }

            // skip meta data header
            if (columnNames == null || headerIndex % 2 == 0) continue;

            TextUtils.splitString(line, columnSeparator, buffer);
            header.setLocationId(buffer[0]);
            header.setQualifierIds(buffer[1]);
            String time = buffer[2];
            String pattern = time.indexOf('-') > -1 ? "dd-MM-yyyy" : "yy/MM/dd HH:mm:ss";
            contentHandler.setTime(contentHandler.getDefaultTimeZone(), pattern, time);

            for (int i = 3; i < buffer.length; i++) {
                // Check for column with name BIJZONDERHEID, add as flag or comment (ToDo)
                if (columnNames[i].length() == 0) continue;
                if (columnNames[i].equalsIgnoreCase("BIJZONDERHEID")) {
                    continue;
                }
                header.setParameterId(columnNames[i]);
                contentHandler.setTimeSeriesHeader(header);
                contentHandler.setValue('.', buffer[i]);
                contentHandler.applyCurrentFields();
            }
        }
    }
}
  • No labels