我正在使用*.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;
}