view backend/src/main/java/org/dive4elements/river/importer/parsers/LineParser.java @ 8032:fd3a24336e6a

SCHEMA CHANGE and Importer (only longitudinal section data so far): only grain fractions given now in schema are valid. We are handling sediment loads, not yields.
author "Tom Gottfried <tom@intevation.de>"
date Mon, 14 Jul 2014 15:36:44 +0200
parents 07cc4cd9233e
children 9342d7fe0ee7
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * 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.parsers;

import java.io.File;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import java.io.IOException;
import java.io.LineNumberReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;


/**
 * Base-Class for parsers for line-based file formats.
 * Calls reset(), then read line by line, calling handleLine() for each,
 * then calls finish().
 */
public abstract class LineParser {

    /** Private logger. */
    private static final Logger log = Logger.getLogger(LineParser.class);

    public static final String ENCODING = "ISO-8859-1";

    public static final Locale DEFAULT_LOCALE = Locale.GERMAN;

    public static final String START_META_CHAR = "#";
    public static final String SEPERATOR_CHAR  = ";";


    protected abstract void handleLine(int lineNum, String line);

    protected abstract void reset();

    protected abstract void finish();

    /** Name of file parsed. */
    protected String fileName;

    protected File inputFile;


    /**
     * This method reads each line of <i>file</i>. At the beginning,
     * <i>reset()</i> is called; afterwards for each line <i>handleLine()</i> is
     * called; at the end <i>finish</i> is called.
     *
     * @param file The file which should be parsed.
     */
    public void parse(File file) throws IOException {
        log.info("Parsing file '" + file + "'");

        inputFile = file;

        fileName = file.getName();

        reset();

        LineNumberReader in = null;
        try {
            in =
                new LineNumberReader(
                new InputStreamReader(
                new FileInputStream(file), ENCODING));

            String line    = null;
            int    lineNum = 1;
            while ((line = in.readLine()) != null) {
                if ((line = line.trim()).length() == 0) {
                    lineNum++;
                    continue;
                }

                handleLine(lineNum++, line);
            }
        }
        finally {
            if (in != null) {
                in.close();
            }
        }

        finish();
    }


    /** Returns the name of the file parsed. */
    protected String getFileName() {
        return fileName;
    }

    /** Returns the file currently parsed. */
    protected File getInputFile() {
        return inputFile;
    }


    protected static String stripMetaLine(String line) {
        String tmp = line.substring(1, line.length());

        // meta-lines often have trailing semicolons in real data
        return tmp.replaceAll(SEPERATOR_CHAR + "*$", "").trim();
    }

    public static double getDouble(String doubleString) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
        Number value = nf.parse(doubleString);

        return value.doubleValue();
    }

    public static Date getDate(String dateString) throws ParseException {
        DateFormat df = SimpleDateFormat.getDateInstance(
            SimpleDateFormat.MEDIUM, DEFAULT_LOCALE);

        return df.parse(dateString);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org