/* ================================================================ * Delft FEWS * ================================================================ * * Project Info: http://www.wldelft.nl/soft/fews/index.html * Project Lead: Karel Heynert (karel.heynert@wldelft.nl) * * (C) Copyright 2003, by WL | Delft Hydraulics * P.O. Box 177 * 2600 MH Delft * The Netherlands * http://www.wldelft.nl * * DELFT-FEWS is a sophisticated collection of modules designed * for building a FEWS customised to the specific requirements * of individual agencies. An open modelling approach allows users * to add their own modules in an efficient way. * * ---------------------------------------------------------------- * AhdTimeSeriesParser.java * ---------------------------------------------------------------- * (C) Copyright 2003, by WL | Delft Hydraulics * * Original Author: Jitka Tacoma */ package nl.wldelft.timeseriesparsers; 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 nl.wldelft.util.TextUtils; import java.io.IOException; public class AhdTimeSeriesParser implements TextParser { private TimeSeriesContentHandler contentHandler = null; private int numHeaders = -1; private LineReader lineReader = null; @Override public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws IOException { this.contentHandler = contentHandler; this.contentHandler.addMissingValue("-999"); this.lineReader = reader; this.lineReader.setCommentLinePrefix('#'); parseHeaders(); if (numHeaders == 0) { throw new IOException("Header has unknown format " + virtualFileName); } for (String[] buffer = new String[numHeaders + 1]; lineReader.readLine(' ', buffer) != -1;) { if (lineReader.getCurrentLine().length() < 2) continue; TextUtils.trimElements(buffer); String dateTimeText = buffer[0].trim().substring(2); //first two character are the key IM contentHandler.setTime(contentHandler.getDefaultTimeZone(), "HHmmssddMMyy", dateTimeText); for (int i = 0; i < numHeaders; i++) { contentHandler.setTimeSeriesHeader(i); contentHandler.setValue('.', buffer[i + 1]); contentHandler.applyCurrentFields(); } } } private void parseHeaders() throws IOException { this.numHeaders = 0; DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader(); for (String line; (line = lineReader.readLine()) != null;) { line = line.trim(); if (line.length() < 2) continue; String key = line.substring(0, 2); String value = line.substring(2); if (key.compareToIgnoreCase("CH") == 0) { header.setLocationId(value); } else if (key.compareToIgnoreCase("KB") == 0) { header.setParameterId(value); } else if (key.compareToIgnoreCase("KE") == 0) { header.setUnit(value); } else if (key.compareToIgnoreCase("IM") == 0) { lineReader.reset(); return; } lineReader.mark(1000); if (header.getParameterId() == null || header.getUnit() == null) continue; this.contentHandler.createTimeSeriesHeaderAlias(numHeaders++, header); header.setParameterId(null); header.setUnit(null); } throw new IOException("Can not find any data line"); } }