/* ================================================================ * 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. * * ---------------------------------------------------------------- * ShdTimeSeriesParser.java * ---------------------------------------------------------------- * (C) Copyright 2003, by WL | Delft Hydraulics * * Original Author: Micha Werner (copied mainly from Eskw200 reader */ package nl.wldelft.timeseriesparsers; import nl.wldelft.util.TextUtils; import nl.wldelft.util.ObjectArrayUtils; 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 org.apache.log4j.Logger; public class VqjaTimeSeriesParser implements TextParser { private static final Logger log = Logger.getLogger(VqjaTimeSeriesParser.class); private LineReader reader = null; private String[] parameterIds = null; @Override public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws IOException { this.reader = reader; reader.setSkipEmptyLines(true); contentHandler.addMissingValue("NA"); DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader(); parseFileParameters(); //Parse from each line: location Id , time and parameter-values. for (String[] buffer = new String[3 + parameterIds.length]; this.reader.readLine(' ', '\"', buffer) != -1;) { header.setLocationId(buffer[0]); //Cut off minutes from the time-string. This reader ignores minutes. contentHandler.setTime(contentHandler.getDefaultTimeZone(), "yyyyMMdd", TextUtils.left(buffer[1], "yyyyMMdd".length()),"HHmm", TextUtils.left(buffer[2], "HHmm".length())); for (int i = 0; i < parameterIds.length; i++) { header.setParameterId(parameterIds[i]); contentHandler.setTimeSeriesHeader(header); contentHandler.setValue('.', buffer[i + 3]); contentHandler.applyCurrentFields(); } } } /** * Read 5 lines and parse parameters Id's from the fifth line * * @return True if at least one parameter is parsed, otherwise False * @throws IOException */ private void parseFileParameters() throws IOException { reader.skipLines(3); // empty line is skipped automatically String[] line = TextUtils.split(reader.readLine(), ' '); if (line.length <= 2) throw new IOException("Parameters Id's expected on line five."); if (!line[0].equalsIgnoreCase("stn") || !line[1].equalsIgnoreCase("time")) { throw new IOException("Keywords 'stn' and 'time' missing on line 5."); } parameterIds = ObjectArrayUtils.copyOfRange(line, 2, line.length - 2); for (int i = 0; i < parameterIds.length; i++) { String parameterId = parameterIds[i]; if (ObjectArrayUtils.indexOf(parameterIds, parameterId) != i) { log.error("Duplicate parameter id " + parameterId + " in header"); } } } }