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



我正在使用*.csv(半逗号分隔,实际上,出于某种原因)文件的几个目录的形式的数据集,我想处理并添加到mysql数据库。昨天,Mr. Data转换器引起了我的注意(赞扬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;
}

首先……一号

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中使用"concat()"方法,或类似的东西?或者使用单个字符串("outputText")为整个mysql输出,而不是字符串数组?

问题2

boolean isNumber (String token) {
  /*if( (token.equals(null)) || isNaN( new Number(string) ) ) {
   return false;
   } */
  return true;
}
我知道这是完全错误的。如何在Processing中编写一个方法来检测字符串是否为数字?

感谢阅读贝尔纳多

第一期:

您的数组行是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。

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

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

Issue2:

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

最新更新