avolar133 / FTP-2-CSV

0 stars 0 forks source link

NoData Values pro Variable konfigurieren #5

Open matthias-mueller opened 5 years ago

matthias-mueller commented 5 years ago

Aktuell ersetzt du sämtliche NoData-Werte für jede Variable durch leere Werte:

https://github.com/avolar133/FTP-2-CSV/blob/e6d442bd2b805c96a32bdc39f285d911d982303f/src/main/java/myPackage/LineFormat.java#L45-L49

Definiert sind sie NoData-Values aber pro Variable, d.h. jede der eingeführten Variablen hat ihren eigenen NoData-Wert.

    WBANNO,
    UTC_DATE,
    UTC_TIME,
    LST_DATE,
    LST_TIME,
    CRX_VN,
    LONGITUDE,
    LATITUDE,
    AIR_TEMPERATURE,
    PRECIPITATION,
    SOLAR_RADIATION,
    SR_FLAG,
    SURFACE_TEMPERATURE,
    ST_TYPE,
    ST_FLAG,
    RELATIVE_HUMIDITY,
    RH_FLAG,
    SOIL_MOISTURE_5,
    SOIL_TEMPERATURE_5,
    WETNESS,
    WET_FLAG,
    WIND_1_5,
    WIND_FLAG

In aktuellen Code werden deshalb auch gültige Werte eliminiert.

Für einige Variablen gibt es auch gar keinen NoData-Wert, hier darf dann auch nicht gefiltert werden.

NoData-Werte pro Variable kann man auch gut auf den Enums implementieren: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

avolar133 commented 4 years ago

Ich habe die enum-Klasse verändert, so dass jedem Wert ein boolean-Attribut hat. Die alle Veränderungen werden noch immer in FormatLine Klasse geändert, weil ich die Überprüfung der Werten aufgeteilt von der enum-Klasse lassen wollte.

matthias-mueller commented 4 years ago

Okay, aber es wird immer noch jedes Feld auf 3 Werte gefiltert, das ist so nicht ganz richtig.

Aus der readme.txt: "C. Missing data are indicated by the lowest possible integer for a given column format, such as -9999.0 for 7-character fields with one decimal place or -99.000 for 7-character fields with three decimal places."

Also: Jedes Datenfeld hat seinen eigenen NoData-Wert - und du festlegen, welchen. Aktuell filterst du jedes Feld gegen 3 Werte, aber nur einer davon ist der korrekte. Die anderen beiden sind potenziell korrekt.

matthias-mueller commented 4 years ago

Und nochmal zur Enum-Klasse - Probier es mal so:

public enum Variable {
    ...
    LONGITUDE(null),
    LATITUDE(null),
    AIR_TEMPERATURE("-9999.0"),
    PRECIPITATION("-9999.0"),
    ...
    ;

    private final String noData;

    Variable(String noData) {
        this.noData = noData;
    }

    public String filterNoData(String s) {
        if (noData == null) {
            return s;
        } else {
            return noData.equals(s) ? "" : s;
        }
    }
}

Dann mach die Variables-Klasse die Filterung selbst und du kannst wieder die alte Schleife benutzen. Das war nämlich eigentlich ganz gut. (Switch/case macht man aus verschiedenen Gründen nicht)

avolar133 commented 4 years ago

Jetzt ändert die enum-Klasse in dem Fall, dass der Wert gleich zum unseren voregegebenen (NoData-)Wert ist. Aber aus dem Readme habe ich die "noData" so interpretiert, dass sie im verschiedenen Format aber abhängig von der Lange auftauchen werden können. (z.B 7-Char Wert kann sowohl als -9999.0, als auch als -999.00 usw. vorkommen. )

matthias-mueller commented 4 years ago

... such as -9999.0 for 7-character fields with one decimal place or -99.000 for 7-character fields with three decimal places ...

Der NoData-Wert hängt damit von der Länge des Feldes und von der Anzahl der Nachkommastellen im jeweiligen Feld ab.

avolar133 commented 4 years ago

Ja, Aber es wird in keinem der Variablen die Anzahl der Nachkommastellen beschrieben.

matthias-mueller commented 4 years ago

Brauchst du auch nicht; die Zahl als String ist eindeutig. Den korrekten String musst du allerdings manuell rausfinden.