一开始我需要一些帮助、想法和支持。
我想用java编写一个应用程序,它读取.csv文件,并使用适当的Insert语句创建.sql文件。
例如:
Title;Author;Price
Java Foundation;Java;15
Excel Tutorial;Excel;25
INSERT INTO TABLE(TITLE,AUTHOR,PRICE) VALUES ('Java Foundation','Java',15);
在这种情况下,我有点不知情,不知道如何正确开始。
感谢您的帮助!
更新
除了一种情况外,这个例子很好用。如果我想转换以下.csv,我会得到一个ArrayIndexOutOfBoundsException。
Title;Forename;Surname
Mr.;Andy;Benson
Mrs.;Susi;
因此:String[] values = lines.get(i).split(delimiter);
它只将CCD_ 2&字符串数组中的'Susi'
,但它也应该在数组中放入一个空字符串" "
。
是否有其他函数/方法可以避免此问题?!通常情况下,不是每一行都填写在.csv文件中。
已解决String[] values = lines.get(i).split(delimiter, -1);
和拆分不会忽略空字段
您可以使用java非阻塞类Files
使用readAllLines
方法读取文件的所有行,然后使用模板String
并使用String
format
方法使用正确的值对其进行格式化。
然后使用java.nio.Files
中的write
方法将语句写入.sql
。
final String template = "INSERT INTO TABLE(%s,%s,%s) VALUES ('%s','%s',%s);";
final String delimiter = ";";
List<String> statements = new ArrayList<>();
List<String> lines = Files.readAllLines(Paths.get("your-file.csv"));
String[] columnNames = lines.get(0).split(delimiter);
for (int i = 1; i < lines.size(); i++) {
String[] values = lines.get(i).split(delimiter);
statements.add(String.format(template, columnNames[0], columnNames[1], columnNames[2], values[0], values[1], values[2]));
}
Files.write(Paths.get("your-output.sql"), statements);
这是一种实现你所要求的目标的简单快捷的方法。当然,您需要将单词TABLE
替换为您的表名:)
更新:
如果您想使语句对.csv
中的值可变,那么您可以使用嵌套的for
循环并修改模板
for (int i = 1; i < lines.size(); i++) {
String[] values = lines.get(i).split(delimiter);
StringBuilder cols = new StringBuilder();
StringBuilder vals = new StringBuilder();
for (int j = 0; j < columnNames.length; j++) {
cols.append(columnNames[j]);
vals.append("'").append(values[j]).append("'");
if (j != columnNames.length - 1) {
cols.append(",");
vals.append(",");
}
}
statements.add(String.format(template, cols.toString(), vals.toString()));
}
然后您将得到如下模板String
:
final String template = "INSERT INTO TABLE (%s) VALUES (%s);";
未经测试,但基本上:
public static String readWholeFile(String filename) throws IOException {
final File file = new File(filename);
final FileInputStream fis = new FileInputStream(file);
final byte[] data = new byte[(int)file.length()];
fis.read(data);
fis.close();
return new String(data, "UTF-8");
}
public static String getInsertQuery(String filename, String TableName) throws IOException {
final String content = readWholeFile(filename);
final String[] lines = content.split("n");
if (lines.length < 2) return ""; // or throw new Exception("not enough lines);
final StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO "+TableName+"("+lines[0].replace(";", ",")+") VALUES ");
for (int i=1; i<lines.length; i++) {
final String[] parts = lines[i].split(";");
sb.append("(");
for (int k=0; k<parts.length; k++) {
sb.append("'"+parts[k]+"'");
if (k != parts.length-1)
sb.append(", ");
}
sb.append(")");
if (i != lines.length-1)
sb.append(", ");
}
return sb.toString();
}
您可以使用POI Jar来解析csv,剩下的就是创建一个带有正确插入语句的文件,这样您就可以读取csv并在循环中将插入语句添加到文件中。