Open matthias-mueller opened 5 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.
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.
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)
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. )
... 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.
Ja, Aber es wird in keinem der Variablen die Anzahl der Nachkommastellen beschrieben.
Brauchst du auch nicht; die Zahl als String ist eindeutig. Den korrekten String musst du allerdings manuell rausfinden.
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.
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