一开始我需要一些帮助、想法和支持。
我想用 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);
它只放置 'Mrs.'
& 'Susi'
在字符串数组中,但它还应该放置一个空字符串 " "
在数组中。
是否有其他函数/方法可以避免这个问题?!通常,.csv 文件中并非每一行都已填写,这是很常见的情况。
已解决 String[] values = lines.get(i).split(delimiter, -1);
并且 split 不会忽略空字段
最佳答案
您可以使用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
,如下所示:
最终字符串模板 =“INSERT INTO TABLE (%s) VALUES (%s);”;
关于java - 从 .csv 文件生成插入 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744451/