Mercurial > dive4elements > river
view flys-backend/src/main/java/de/intevation/flys/importer/StaFileParser.java @ 769:321b9e480f72
Added a method to river to find the gauge with the max overlap with a given interval.
flys-backend/trunk@2235 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 26 Jun 2011 16:13:08 +0000 |
parents | cce054f27dac |
children |
line wrap: on
line source
package de.intevation.flys.importer; import java.io.File; import java.io.IOException; import java.io.LineNumberReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.math.BigDecimal; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.HashMap; import java.util.ArrayList; import org.apache.log4j.Logger; public class StaFileParser { private static Logger log = Logger.getLogger(StaFileParser.class); public static final String ENCODING = "ISO-8859-1"; public static final String TYPES = System.getProperty("flys.backend.main.value.types", "QWTD"); public static final Pattern QWTD_ = Pattern.compile("\\s*([^\\s]+)\\s+([^\\s]+)\\s+([" + Pattern.quote(TYPES) + "]).*"); public StaFileParser() { } public boolean parse(ImportGauge gauge) throws IOException { File file = gauge.getStaFile(); log.info("parsing STA file: " + file); LineNumberReader in = null; try { in = new LineNumberReader( new InputStreamReader( new FileInputStream(file), ENCODING)); String line = in.readLine(); if (line == null) { log.warn("STA file is empty."); return false; } if (line.length() < 37) { log.warn("first line in STA file is too short."); return false; } gauge.setName(line.substring(16, 37).trim()); String [] values = line.substring(38).trim().split("\\s+", 2); if (values.length < 2) { log.warn("Not enough columns for aeo and datum"); } try { gauge.setAeo(new BigDecimal(values[0].replace(",", "."))); gauge.setDatum(new BigDecimal(values[1].replace(",", "."))); } catch (NumberFormatException nfe) { log.warn("cannot parse aeo or datum"); return false; } line = in.readLine(); if (line == null) { log.warn("STA file has not enough lines"); return false; } if (line.length() < 36) { log.warn("second line is too short"); return false; } try { gauge.setStation( new BigDecimal(line.substring(29, 36).trim())); } catch (NumberFormatException nfe) { log.warn("parsing of the datum of the gauge failed"); return false; } // overread the next six lines for (int i = 0; i < 6; ++i) { if ((line = in.readLine()) == null) { log.warn("STA file is too short"); return false; } } HashMap<String, ImportMainValueType> types = new HashMap<String, ImportMainValueType>(); ArrayList<ImportNamedMainValue> namedMainValues = new ArrayList<ImportNamedMainValue>(); ArrayList<ImportMainValue> mainValues = new ArrayList<ImportMainValue>(); while ((line = in.readLine()) != null) { Matcher m = QWTD_.matcher(line); if (m.matches()) { BigDecimal value; try { value = new BigDecimal(m.group(2).replace(",", ".")); } catch (NumberFormatException nfe) { log.warn("value not parseable in line " + in.getLineNumber()); continue; } String typeString = m.group(3); log.debug("\t type: " + typeString); ImportMainValueType type = types.get(typeString); if (type == null) { type = new ImportMainValueType(typeString); types.put(typeString, type); } String name = m.group(1); ImportNamedMainValue namedMainValue = new ImportNamedMainValue(type, name); namedMainValues.add(namedMainValue); ImportMainValue mainValue = new ImportMainValue(gauge, namedMainValue, value); mainValues.add(mainValue); } else { // TODO: treat as a comment } } gauge.setMainValueTypes( new ArrayList<ImportMainValueType>(types.values())); gauge.setNamedMainValues(namedMainValues); gauge.setMainValues(mainValues); } finally { if (in != null) { in.close(); } } log.info("finished parsing STA file: " + file); return true; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :