X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fload%2FFieldGuesser.java;h=970926ba14bcdf9d22ece3cbc6bac2d45846efdc;hb=92dad5df664287acb51728e9ea599f150765d34a;hp=032874af74da8ac9dafa5ad7e36f43dbfd71bbb2;hpb=da0b1f449260a0b4a94318006382a9039726ef3e;p=GpsPrune.git diff --git a/tim/prune/load/FieldGuesser.java b/tim/prune/load/FieldGuesser.java index 032874a..970926b 100644 --- a/tim/prune/load/FieldGuesser.java +++ b/tim/prune/load/FieldGuesser.java @@ -4,7 +4,7 @@ import tim.prune.I18nManager; import tim.prune.data.Field; import tim.prune.data.Latitude; import tim.prune.data.Longitude; -import tim.prune.data.Timestamp; +import tim.prune.data.TimestampUtc; /** * Class to try to match data with field names, @@ -19,20 +19,42 @@ public abstract class FieldGuesser */ private static boolean isHeaderRow(String[] inValues) { - // Loop over values looking for a Latitude value + // Loop over values seeing if any are mostly numeric if (inValues != null) { - for (int v=0; v= '0' && currChar <= '9') {numNums++;} + } + // Return true if more than half the characters are numeric + return numNums > (numChars/2); + } + /** * Try to guess the fields for the given values from the file * @param inValues array of values from first non-blank line of file @@ -80,6 +102,18 @@ public abstract class FieldGuesser fields[f] = Field.TIMESTAMP; continue; } + // check for tracksegment + if (!checkArrayHasField(fields, Field.NEW_SEGMENT) && fieldLooksLikeSegment(value, isHeader)) + { + fields[f] = Field.NEW_SEGMENT; + continue; + } + // check for waypoint type + if (!checkArrayHasField(fields, Field.WAYPT_TYPE) && fieldLooksLikeWaypointType(value, isHeader)) + { + fields[f] = Field.WAYPT_TYPE; + continue; + } } } // Fill in the rest of the fields using just custom fields @@ -96,12 +130,24 @@ public abstract class FieldGuesser else if (!checkArrayHasField(fields, Field.LONGITUDE)) { fields[f] = Field.LONGITUDE; } - else { - customFieldNum++; - fields[f] = new Field(customPrefix + (customFieldNum)); + else + { + // Can we use the field name given? + Field customField = null; + if (isHeader && inValues[f] != null && inValues[f].length() > 0) { + customField = new Field(inValues[f]); + } + // Find an unused field number + while (customField == null || checkArrayHasField(fields, customField)) + { + customFieldNum++; + customField = new Field(customPrefix + (customFieldNum)); + } + fields[f] = customField; } } } + // Do a final check to make sure lat and long are in there if (!checkArrayHasField(fields, Field.LATITUDE)) { fields[0] = Field.LATITUDE; @@ -109,6 +155,10 @@ public abstract class FieldGuesser else if (!checkArrayHasField(fields, Field.LONGITUDE)) { fields[1] = Field.LONGITUDE; } + // Longitude _could_ have overwritten latitude in position 1 + if (!checkArrayHasField(fields, Field.LATITUDE)) { + fields[0] = Field.LATITUDE; + } return fields; } @@ -195,6 +245,7 @@ public abstract class FieldGuesser String upperValue = inValue.toUpperCase(); return (upperValue.equals("ALTITUDE") || upperValue.equals("ALT") + || upperValue.equals("HMSL") // height above mean sea level || upperValue.equals(I18nManager.getText("fieldname.altitude").toUpperCase())); } else @@ -266,8 +317,54 @@ public abstract class FieldGuesser { // must be at least 7 characters long if (inValue.length() < 7) {return false;} - Timestamp stamp = new Timestamp(inValue); + TimestampUtc stamp = new TimestampUtc(inValue); return stamp.isValid(); } } + + /** + * Check whether the given String looks like a track segment field + * @param inValue value from file + * @param inIsHeader true if this is a header line, false for data + * @return true if it could be a track segment + */ + private static boolean fieldLooksLikeSegment(String inValue, boolean inIsHeader) + { + if (inValue == null || inValue.equals("")) {return false;} + if (inIsHeader) + { + String upperValue = inValue.toUpperCase(); + // This is a header line so look for english or local text + return upperValue.equals("SEGMENT") + || upperValue.equals(I18nManager.getText("fieldname.newsegment").toUpperCase()); + } + else + { + // can't reliably identify it just using the value + return false; + } + } + + /** + * Check whether the given String looks like a waypoint type + * @param inValue value from file + * @param inIsHeader true if this is a header line, false for data + * @return true if it could be a waypoint type + */ + private static boolean fieldLooksLikeWaypointType(String inValue, boolean inIsHeader) + { + if (inValue == null || inValue.equals("")) {return false;} + if (inIsHeader) + { + String upperValue = inValue.toUpperCase(); + // This is a header line so look for english or local text + return (upperValue.equals("TYPE") + || upperValue.equals(I18nManager.getText("fieldname.waypointtype").toUpperCase())); + } + else + { + // can't reliably identify it just using the value + return false; + } + } }