Mercurial > dive4elements > river
changeset 1196:46127af605ba
Added parser for PRF files. TODO: Extract data and km.
flys-backend/trunk@2296 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 06 Jul 2011 17:54:49 +0000 |
parents | 2b4de678e29a |
children | ce3dacc6ea92 |
files | flys-backend/ChangeLog flys-backend/src/main/java/de/intevation/flys/importer/PRFParser.java |
diffstat | 2 files changed, 218 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/flys-backend/ChangeLog Wed Jul 06 15:35:38 2011 +0000 +++ b/flys-backend/ChangeLog Wed Jul 06 17:54:49 2011 +0000 @@ -1,3 +1,8 @@ +2011-07-06 Sascha L. Teichmann <sascha.teichmann@intevation.de> + + * src/main/java/de/intevation/flys/importer/PRFParser.java: New. + Parser for PRF files. TODO extra data and station from data lines. + 2011-07-06 Sascha L. Teichmann <sascha.teichmann@intevation.de> * src/main/java/de/intevation/flys/model/Point3d.java: Deleted.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-backend/src/main/java/de/intevation/flys/importer/PRFParser.java Wed Jul 06 17:54:49 2011 +0000 @@ -0,0 +1,213 @@ +package de.intevation.flys.importer; + +import java.util.Map; +import java.util.Stack; +import java.util.TreeMap; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import java.io.File; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.io.FileInputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +public class PRFParser +{ + private static Logger log = Logger.getLogger(PRFParser.class); + + public static final String ENCODING = + System.getProperty("flys.backend.prf.encoding", "ISO-8859-1"); + + public static final Pattern DATA_PATTERN = + Pattern.compile( + "\\((\\d+)x\\s*,\\s*(\\d+)\\(" + + "\\s*f(\\d+)\\.(\\d+)\\s*,\\s*f(\\d+)\\.(\\d+)\\s*\\)?\\)?"); + + public static final Pattern KM_PATTERN = + Pattern.compile("\\((\\d+)x\\s*,\\s*f(\\d+)\\.(\\d+)\\s*\\)?"); + + public static class DataFormat { + + protected int deleteChars; + protected int maxRepetitions; + protected int firstIntegerPlaces; + protected int firstFractionPlaces; + protected int secondIntegerPlaces; + protected int secondFractionPlaces; + + public DataFormat() { + } + + public DataFormat(Matcher m) { + deleteChars = Integer.parseInt(m.group(1)); + maxRepetitions = Integer.parseInt(m.group(2)); + firstIntegerPlaces = Integer.parseInt(m.group(3)); + firstFractionPlaces = Integer.parseInt(m.group(4)); + secondIntegerPlaces = Integer.parseInt(m.group(5)); + secondFractionPlaces = Integer.parseInt(m.group(6)); + } + + public void extractData(String line, Map<Double, Double> dest) { + //TODO: Implement me! + } + } // class DataFormat + + public static class KMFormat { + protected int deleteChars; + protected int integerPlaces; + protected int fractionPlaces; + + public KMFormat() { + } + + public KMFormat(Matcher m) { + deleteChars = Integer.parseInt(m.group(1)); + integerPlaces = Integer.parseInt(m.group(2)); + fractionPlaces = Integer.parseInt(m.group(3)); + } + + public double extractKm(String line) { + // TODO: Implement me! + return 0d; + } + } // class KMFormat + + protected Map<Double, Map<Double, Double>> data; + + public PRFParser() { + data = new TreeMap<Double, Map<Double, Double>>(); + } + + + public boolean parse(File file) { + + if (!(file.isFile() && file.canRead())) { + log.warn("cannot open file '" + file + "'"); + return false; + } + + log.info("parsing PRF file: '" + file + "'"); + + LineNumberReader in = null; + + try { + in = + new LineNumberReader( + new InputStreamReader( + new FileInputStream(file), ENCODING)); + + String line = in.readLine(); + + if (line == null || (line = line.trim()).length() == 0) { + log.warn("file is empty."); + return false; + } + + Matcher m = DATA_PATTERN.matcher(line); + + if (!m.matches()) { + log.warn("First line does not look like a PRF data pattern."); + return false; + } + + DataFormat dataFormat = new DataFormat(m); + + if ((line = in.readLine()) == null) { + log.warn("premature EOF. Expected integer in line 2"); + return false; + } + + try { + if (Integer.parseInt(line) != dataFormat.maxRepetitions) { + log.warn("Expected " + + dataFormat.maxRepetitions + " in line 2"); + return false; + } + } + catch (NumberFormatException nfe) { + log.warn("invalid integer in line 2", nfe); + return false; + } + + if ((line = in.readLine()) == null) { + log.warn( + "premature EOF. Expected pattern for km extraction"); + return false; + } + + m = KM_PATTERN.matcher(line); + + if (!m.matches()) { + log.warn( + "line 4 does not look like a PRF km extraction pattern."); + return false; + } + + while ((line = in.readLine()) != null) { + if (line.length() == 0) { + continue; + } + // TODO: Do data and km extraction + } + } + catch (IOException ioe) { + log.error(ioe); + return false; + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException ioe) { + log.error(ioe); + } + } + } + + return true; + } + + public void reset() { + data.clear(); + } + + public static void parsePRFs(File root) { + + PRFParser parser = new PRFParser(); + + Stack<File> stack = new Stack<File>(); + stack.push(root); + + while (!stack.empty()) { + File file = stack.pop(); + if (file.isDirectory()) { + File [] files = file.listFiles(); + if (files != null) { + for (File f: files) { + stack.push(f); + } + } + } + else if (file.isFile() + && file.getName().toLowerCase().endsWith(".prf") + ) { + parser.reset(); + boolean success = parser.parse(file); + log.info("parsing " + (success ? "succeeded" : "failed")); + } + } + } + + public static void main(String [] args) { + + for (String arg: args) { + parsePRFs(new File(arg)); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :