Java source code
/* ================================================================ * 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. * * ---------------------------------------------------------------- * JWTC3DMVTimeSeriesParser.java * ---------------------------------------------------------------- * (C) Copyright 2003, by WL | Delft Hydraulics * * Original Author: pelgrim * Contributor(s): * * Changes: * -------- * 29-Jul-14 : Version 1 (); * * */ package nl.wldelft.timeseriesparsers; import nl.wldelft.util.FastDateFormat; 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.SimpleEquidistantTimeStep; import nl.wldelft.util.timeseries.TimeSeriesContentHandler; import java.util.Locale; public class JTWCTimeSeriesParser implements TextParser<TimeSeriesContentHandler> { private FastDateFormat format; @Override public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws Exception { format = FastDateFormat.getInstance("yyyyMMddHH", contentHandler.getDefaultTimeZone(), Locale.US, null); DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader(); reader.skipLines(2); String line = reader.readLine(); String[] buffer = TextUtils.split(line, ' '); long time0 = format.parseToMillis(buffer[0]); header.setForecastTime(time0); //FEWS-11423 do not set location id anymore so data can be mapped to any location from the import //header.setLocationId(buffer[2]); line = reader.readLine(); while (!line.contains("AMP")) { buffer = TextUtils.split(line, ' '); contentHandler.setTime(Integer.parseInt(buffer[0].substring(1)) * SimpleEquidistantTimeStep.HOUR.getStepMillis() + time0); header.setParameterId("lat"); contentHandler.setTimeSeriesHeader(header); contentHandler.setValue('.', getValue(buffer[1])); contentHandler.applyCurrentFields(); header.setParameterId("lon"); contentHandler.setTimeSeriesHeader(header); contentHandler.setValue('.', getValue(buffer[2])); contentHandler.applyCurrentFields(); header.setParameterId("maxWind"); contentHandler.setTimeSeriesHeader(header); contentHandler.setValue('.', buffer[3]); contentHandler.applyCurrentFields(); for (int i = 4; i < buffer.length; i += 13) { for (int j = 0; j < 12; j += 3) { header.setParameterId(buffer[i] + buffer[i + 2 + j]); contentHandler.setTimeSeriesHeader(header); contentHandler.setValue('.', buffer[i + 1 + j]); contentHandler.applyCurrentFields(); } } line = reader.readLine(); } } private static String getValue(String inputString) { int length = inputString.length(); String beforeDecimal = inputString.substring(0, length - 2); char afterDecimal = inputString.charAt(length - 2); String stringValue = beforeDecimal + '.' + afterDecimal; if (inputString.endsWith("S") || inputString.endsWith("W")) stringValue = "-" + stringValue; return stringValue; } }