从.csv文件生成插入SQL语句

时间:2016-04-20 12:53:56

标签: java sql excel csv

我在开始时需要一些帮助,想法和支持。

我想在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);并且拆分不会忽略空字段

3 个答案:

答案 0 :(得分:3)

您可以使用java非阻塞类Files使用readAllLines方法读取文件的所有行,然后使用模板String并使用正确的值对其进行格式化使用String format方法。

然后使用.sql中的write方法将您的语句写入java.nio.Files

    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);";

答案 1 :(得分:1)

未经测试,但非常多:

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();
}

答案 2 :(得分:0)

您可以使用POI Jar来解析csv,其余的是使用正确的insert语句创建一个文件,这样您就可以读取csv并在循环中将insert语句添加到文件中。