protected static TSDataType typeInfer(String strValue) {
    if (strValue.contains("\"")) {
      return strValue.length() <= 512 + 2 ? STRING : TEXT;
    }
    if (isBoolean(strValue)) {
      return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_BOOLEAN);
    } else if (isTimeStamp(strValue)) {
      return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_TIMESTAMP);
    } else if (isNumber(strValue)) {
      if (!strValue.contains(TsFileConstant.PATH_SEPARATOR)) {
        if (isConvertFloatPrecisionLack(StringUtils.trim(strValue))) {
          return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_LONG);
        }
        return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_INT);
      } else {
        return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_FLOAT);
      }
    } else if (Constants.DATATYPE_NULL.equals(strValue)
        || Constants.DATATYPE_NULL.toUpperCase().equals(strValue)) {
      return null;
      // "NaN" is returned if the NaN Literal is given in Parser
    } else if (Constants.DATATYPE_NAN.equals(strValue)) {
      return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_NAN);
    } else if (isDate(strValue)) {
      return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_DATE);
    } else if (isBlob(strValue)) {
      return Constants.TYPE_INFER_KEY_DICT.get(Constants.DATATYPE_BLOB);
    } else if (strValue.length() <= 512) {
      return STRING;
    } else {
      return TEXT;
    }
  }
if data type of timeseries is not defined in headers of schema, this method will be called to
do type inference

@param strValue
@return
iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/AbstractDataTool.java