Processing / Java:将String数组项添加/追加到String +类型检测

时间:2011-12-02 11:55:17

标签: java processing

我正在处理几个目录形式的数据集* .csv(半逗号分隔,实际上,由于某种原因)文件,我想处理并添加到mysql数据库。昨天,先生。数据转换器引起了我的注意(赞美twitter!)并对代码进行了一些调整,允许我使用半逗号分隔的文本,通过复制+粘贴。

这很好,但我想知道我是否可以将代码(javascript)移植到处理中,以便我可以递归地浏览文件并添加表格。虽然它的大部分工作(至少是语法),但是有几个问题使我无法在上面提到的一堆文件中进行实际测试。

下面是我到目前为止的代码(除了用于加载文件的SQLibrary和样板代码),以及下面的问题。

String newLine = "\n";
String indent = " ";
String toMySql(String[] lines, String tableName, String[] columnNames, String[] columnTypes, String indent, String newLine) {
  String outputText = "";
  int rowCount = lines.length;
  int columnCount = columnNames.length;
  //begin render loop
  outputText += "CREATE TABLE "+tableName+" (" + newLine;
  outputText += indent+"id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,"+newLine;
  for (int i=0; i < columnCount; i++) {
    String dataType = "VARCHAR(255)";
    if ((columnTypes[i].equals("int"))||(columnTypes[i].equals("float"))) {
      dataType = columnTypes[i].toUpperCase();
    };
    outputText += indent+""+columnNames[i]+" "+dataType;
    if (i < columnCount - 1) {
      outputText += ",";
    }
    outputText += newLine;
  }
  outputText += ");" + newLine;
  outputText += "INSERT INTO "+tableName+" "+newLine+indent+"(";
  for (int i=0; i < columnCount; i++) {
    outputText += columnNames[i];
    if (i < columnCount - 1) {
      outputText += ",";
    }
  }
  outputText += ") "+newLine+"VALUES "+newLine;
  for (int i=0; i < rowCount; i++) {
    outputText += indent+"(";
    for (int j=0; j < columnCount; j++) {
      if ((columnTypes[j] == "int")||(columnTypes[j] == "float")) {
        // outputText += lines[i][j] || "null";
      }
      else {
        // outputText += "'"+( lines[i][j] || "" )+"'";
      }
      if (j < columnCount - 1) outputText += ",";
    }
    outputText += ")";
    if (i < rowCount - 1) outputText += ","+newLine;
  }
  outputText += ";";
  return outputText;
}
String[] getColumnNames(String[] lines, String delimiter) {
  return split(lines[0], delimiter);
}
//test columns for number data type
String[] getColumnTypes(String[] lines, String delimiter) {
  int columnCount = split(lines[0], delimiter).length;
  String[] columnTypes = new String[columnCount];
  int numRowsToTest = columnCount;
  float threshold = 0.5;
  for (int i=0; i < columnCount; i++) {
    int floatCount = 0;
    int intCount = 0;
    for (int j=0; j < numRowsToTest; j++) {
      /*if (CSVParser.isNumber(lines[j][i])) {
       intCount++;
       if (String(lines[j][i]).indexOf(".") > 0) {
       floatCount++;
       }
       }*/
    }
    if ((intCount / numRowsToTest) > threshold) {
      if (floatCount > 0) {
        columnTypes[i] = "float";
      }
      else {
        columnTypes[i] = "int";
      }
    }
    else {
      columnTypes[i] = "string";
    }
  }
  return columnTypes;
}
boolean isNumber (String token) {
  /*if( (token.equals(null)) || isNaN( new Number(string) ) ) {
   return false;
   } */
  return true;
}

首先......

第1期

for (int i=0; i < rowCount; i++) {
    outputText += indent+"(";
    for (int j=0; j < columnCount; j++) {
      if ((columnTypes[j] == "int")||(columnTypes[j] == "float")) {
        // HERE!
        // outputText += lines[i][j] || "null";
      }
      else {
         // AND HERE!
        // outputText += "'"+( lines[i][j] || "" )+"'";
      }
      if (j < columnCount - 1) outputText += ",";
    }
    outputText += ")";
    if (i < rowCount - 1) outputText += ","+newLine;
  }

注释行返回“表达式的类型必须是数组类型,但它解析为String”错误。如果我指的是二维String数组的项/索引,那不是String本身吗?

这与使用“+ =”运算符有什么关系,而不是String中的“concat()”方法,或类似的东西?或者使用单个字符串(“outputText”)代替整个mysql输出,而不是String数组?

第2期

boolean isNumber (String token) {
  /*if( (token.equals(null)) || isNaN( new Number(string) ) ) {
   return false;
   } */
  return true;
}

这是完全错的,我知道。如何在Processing中编写一个方法来检测String是否为数字?

感谢阅读, 伯纳

2 个答案:

答案 0 :(得分:0)

问题1:

您的数组行是String[]而不是String[][],因此lines[i][j]没有意义。我认为你应该使用lines[i]

另请注意,您可以使用String.valueOf而不是自己|| "null",即

outputText += String.valueOf(lines[i]);

问题2:

你可以用这个:

boolean isNumber (String token) {
  try {
    Integer.parseInt(token);
    return true;
  } catch (NumberFormatException e) {
    return false;
  }
}

如果令牌是格式化的数字(例如,使用本地化的小数点分隔符),那么您可以使用NumberFormat解析并捕获ParseException。

答案 1 :(得分:0)

问题1:
outputText += String.valueOf(lines[i][j]);

outputText += "'" + String.valueOf(lines[i][j])+ "'";

问题2:

boolean isNumber (String token) { 
  try {
      Integer.parseInt(token);
  } catch(Exception e) {
    return false;
  }      
  return true;
}