package nl.wldelft.timeseriesparsers;

import nl.wldelft.util.ColumnSeparatorConsumer;
import nl.wldelft.util.DateTimePatternConsumer;
import nl.wldelft.util.DecimalSeparatorConsumer;
import nl.wldelft.util.io.LineReader;
import nl.wldelft.util.io.TextParser;
import nl.wldelft.util.timeseries.DefaultTimeSeriesHeader;
import nl.wldelft.util.timeseries.TimeSeriesContentHandler;

import java.io.IOException;
import java.util.TimeZone;

/**
 *  @see <a href="https://publicwiki.deltares.nl/display/FEWSDOC/LocationIdsHeaderCsv">wiki</a>
 */
public class LocationIdsHeaderCsvParser implements TextParser<TimeSeriesContentHandler>, DecimalSeparatorConsumer, ColumnSeparatorConsumer, DateTimePatternConsumer {
    private String dateTimePattern = "dd/MM/yyyy HH:mm:ss";
    private char decimalSeparator = '.';
    private char columnSeparator = ',';

    @Override
    public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws IOException {
        contentHandler.addMissingValue("-");
        reader.setSkipEmptyLines(true);

        DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader();
        String[] headerLine = reader.readLine(columnSeparator);
        for (int i = 1; i < headerLine.length; i++) {
            header.setLocationId(headerLine[i]);
            contentHandler.createTimeSeriesHeaderAlias(i, header);
        }
        TimeZone timeZone = contentHandler.getDefaultTimeZone();

        for (String[] buffer = new String[headerLine.length]; reader.readLine(columnSeparator, '\"', buffer) != -1; ) {
            contentHandler.setTime(timeZone, dateTimePattern, buffer[0]);
            for (int i = 1; i < buffer.length; i++) {
                contentHandler.setTimeSeriesHeader(i);
                contentHandler.setValue(decimalSeparator, buffer[i]);
                contentHandler.applyCurrentFields();
            }
        }
    }

    @Override
    public void setColumnSeparator(char columnSeparator) {
        this.columnSeparator = columnSeparator;
    }

    @Override
    public void setDecimalSeparator(char decimalSeparator) {
        this.decimalSeparator = decimalSeparator;
    }

    @Override
    public void setDateTimePattern(String dateTimePattern) {
        this.dateTimePattern = dateTimePattern;
    }

}
  • No labels