]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/load/FieldGuesser.java
Version 19, May 2018
[GpsPrune.git] / tim / prune / load / FieldGuesser.java
index 6b29379eee308fb0b715a7a682fcab4b8477dcaf..970926ba14bcdf9d22ece3cbc6bac2d45846efdc 100644 (file)
@@ -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<inValues.length; v++)
+                       for (String value : inValues)
                        {
-                               Latitude lat = new Latitude(inValues[v]);
-                               if (lat.isValid()) {return false;}
+                               if (fieldLooksNumeric(value)) {return false;}
                        }
                }
-               // No valid Latitude value found so presume header
+               // No (mostly) numeric values found so presume header
                return true;
        }
 
 
+       /**
+        * See if a field looks numeric or not by comparing the number of numeric vs non-numeric characters
+        * @param inValue field value to check
+        * @return true if there are more numeric characters than not
+        */
+       private static boolean fieldLooksNumeric(String inValue)
+       {
+               if (inValue == null) {
+                       return false;
+               }
+               final int numChars = inValue.length();
+               if (numChars < 3) {return false;} // Don't care about one or two character values
+               // Loop through characters seeing which ones are numeric and which not
+               int numNums = 0;
+               for (int i=0; i<numChars; i++)
+               {
+                       char currChar = inValue.charAt(i);
+                       if (currChar >= '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
@@ -108,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;
@@ -211,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
@@ -282,7 +317,7 @@ 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();
                }
        }
@@ -300,7 +335,8 @@ public abstract class FieldGuesser
                {
                        String upperValue = inValue.toUpperCase();
                        // This is a header line so look for english or local text
-                       return upperValue.equals("SEGMENT");
+                       return upperValue.equals("SEGMENT")
+                               || upperValue.equals(I18nManager.getText("fieldname.newsegment").toUpperCase());
                }
                else
                {