我正在处理几个目录形式的数据集* .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是否为数字?
感谢阅读, 伯纳
答案 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;
}