Mercurial > dive4elements > river
view backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/DailyDischargeParser.java @ 9654:8a2a777a8372
Importer (s/u-info) extensions: check and log message for missing values (km, date, waterlevel etc.) and wrong waterlevel unit
author | mschaefer |
---|---|
date | Mon, 23 Mar 2020 15:10:09 +0100 |
parents | abe069eb180c |
children | d86c7cb68b41 |
line wrap: on
line source
/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.importer.sinfo.parsers; import java.io.File; import java.io.FilenameFilter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.dive4elements.river.importer.Config; import org.dive4elements.river.importer.ImportRiver; import org.dive4elements.river.importer.common.AbstractParser; import org.dive4elements.river.importer.common.ParsingState; import org.dive4elements.river.importer.sinfo.importitem.DailyDischargeDayLineImport; import org.dive4elements.river.importer.sinfo.importitem.DailyDischargeSeriesImport; import org.dive4elements.river.model.sinfo.DailyDischarge; import org.dive4elements.river.model.sinfo.DailyDischargeValue; /** * Reads and parses a daily discharge file * * @author Matthias Schäfer * */ public class DailyDischargeParser extends AbstractParser<DailyDischarge, DailyDischargeValue, DailyDischargeDayLineImport, DailyDischargeSeriesImport> { /***** FIELDS *****/ private static final Logger log = Logger.getLogger(DailyDischargeParser.class); static final Pattern IMPORT_FILENAME = Pattern.compile("^(.+)_mittlerer_Tagesabfluss.csv", Pattern.CASE_INSENSITIVE); private static final Pattern META_GAUGENAME = Pattern.compile("^#\\s*Stations-*Name:\\s*(\\S[^;]*).*", Pattern.CASE_INSENSITIVE); private static final Pattern META_GAUGENUMBER = Pattern.compile("^#\\s*Stations-*Nummer:\\s*(\\S[^;]*).*", Pattern.CASE_INSENSITIVE); private static final Pattern META_COLUMNTITLES = Pattern.compile("^#*\\s*Datum\\s*;\\s*Q.*", Pattern.CASE_INSENSITIVE); private static final DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); /***** CONSTRUCTORS *****/ public DailyDischargeParser(final File importPath, final File rootRelativePath, final ImportRiver river) { super(importPath, rootRelativePath, river); } /***** METHODS *****/ @Override protected Logger getLog() { return log; } /** * Whether this import type shall be skipped */ public static boolean shallSkip() { return Config.INSTANCE.skipSInfoDailyDischarge(); } /** * Creates a list of parsers for all daily discharge import files in a directory */ public static List<DailyDischargeParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) { final List<DailyDischargeParser> parsers = new ArrayList<>(); if (importDir.exists()) { final File[] files = importDir.listFiles(new FilenameFilter() { @Override public boolean accept(final File dir, final String name) { return IMPORT_FILENAME.matcher(name).matches(); } }); for (final File file : files) parsers.add(new DailyDischargeParser(file, new File(relativeDir, file.getName()), river)); } return parsers; } @Override protected KmMode kmMode() { return KmMode.NONE; } @Override protected DailyDischargeSeriesImport createSeriesImport(final String filename) { return new DailyDischargeSeriesImport(filename); } @Override protected DailyDischargeDayLineImport createKmLineImport(final Double km, final String[] values) { Date day = null; try { day = dateFormat.parse(values[0]); } catch (final Exception e) { logError("Invalid date in line " + this.in.getLineNumber()); return null; } if (parseDoubleWithNull(values[1]) == null) { logError("Invalid discharge value in line " + this.in.getLineNumber()); return null; } return new DailyDischargeDayLineImport(day, Double.valueOf(parseDoubleWithNull(values[1]).doubleValue())); } @Override protected boolean handleMetaOther() { if (handleMetaGaugeName()) return true; else if (handleMetaGaugeNumber()) return true; else return false; } private boolean handleMetaGaugeName() { final Matcher m = META_GAUGENAME.matcher(this.currentLine); if (m.matches()) { this.metaPatternsMatched.add(META_GAUGENAME); this.seriesHeader.setGaugeName(m.group(1).trim()); return true; } return false; } private boolean handleMetaGaugeNumber() { final Matcher m = META_GAUGENUMBER.matcher(this.currentLine); if (m.matches()) { this.metaPatternsMatched.add(META_GAUGENUMBER); this.seriesHeader.setGaugeNumber(Long.parseLong(m.group(1))); return true; } return false; } @Override protected boolean handleMetaColumnTitles() { if (!META_COLUMNTITLES.matcher(this.currentLine).matches()) return false; this.metaPatternsMatched.add(META_COLUMNTITLES); this.columnTitles.clear(); final String[] titles = this.currentLine.split(SEPARATOR_CHAR, 0); for (int i = 0; i <= titles.length - 1; i++) this.columnTitles.add(titles[i].trim()); this.seriesHeader.setGauge(this.river.getPeer().findGauge(this.seriesHeader.getGaugeNumber(), this.seriesHeader.getGaugeName())); if (this.seriesHeader.getGauge() == null) { logError("Gauge not found, file skipped"); this.headerParsingState = ParsingState.STOP; } return true; } }