/* ================================================================ * 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. * * ---------------------------------------------------------------- * Eksw2005TimeSeriesParser.java * ---------------------------------------------------------------- * (C) Copyright 2003, by WL | Delft Hydraulics * * Original Author: Jitka Tacoma */ package nl.wldelft.fews.system.plugin.dataImport; import nl.wldelft.util.ObjectArrayUtils; 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; import org.apache.log4j.Logger; import java.io.IOException; public class Eksw2005TimeSeriesParser implements TextParser { private static final Logger log = Logger.getLogger(Eksw2005TimeSeriesParser.class); private LineReader reader = null; private String[] parameterIds = null; @Override public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws Exception { contentHandler.addMissingValue("NA"); this.reader = reader; this.reader.setSkipEmptyLines(true); DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader(); parseFileParameters(); //Parse from each line: location Id , time and parameter-values. for (String[] buffer = new String[2 + 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(), "yyyyMMddHH", TextUtils.left(buffer[1], "yyyyMMddHH".length())); for (int i = 0; i < parameterIds.length; i++) { header.setParameterId(parameterIds[i]); contentHandler.setTimeSeriesHeader(header); contentHandler.setValue('.', buffer[i + 2]); 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 Exception { 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"); if (!line[0].equalsIgnoreCase("stn") || !line[1].equalsIgnoreCase("time")) { throw new Exception("Keywords 'stn' and 'time' missing on the fifth header line."); } 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"); } } } }