Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从.csv文件生成Insert SQL语句_Java_Sql_Excel_Csv - Fatal编程技术网

Java 从.csv文件生成Insert SQL语句

Java 从.csv文件生成Insert SQL语句,java,sql,excel,csv,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); 在这种情况下,我有点不知道,不知道如何正确开始 谢谢你的帮助

一开始我需要一些帮助、想法和支持

我想用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(分隔符)

它只将
'Mrs.
'Susi'
放在字符串数组中,但它还应将一个空字符串
放在数组中

是否有其他功能/方法可以避免此问题?!通常情况下,并非每一行都填写在.csv文件中


已解决
String[]value=lines.get(i).split(分隔符,-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();
}
公共静态字符串readWholeFile(字符串文件名)引发IOException{
最终文件=新文件(文件名);
最终文件输入流fis=新文件输入流(文件);
最终字节[]数据=新字节[(int)file.length()];
fis.读取(数据);
fis.close();
返回新字符串(数据“UTF-8”);
}
公共静态字符串getInsertQuery(字符串文件名、字符串表名)引发IOException{
最终字符串内容=readWholeFile(文件名);
最终字符串[]行=content.split(“\n”);
if(lines.length<2)返回“”;//或抛出新异常(“行数不足”);
最终StringBuilder sb=新StringBuilder();
sb.追加(“插入到“+TableName+”(“+lines[0]。替换(“;”,“,”+”)值”);

对于(int i=1;i未测试,但基本上:

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();
}
公共静态字符串readWholeFile(字符串文件名)引发IOException{
最终文件=新文件(文件名);
最终文件输入流fis=新文件输入流(文件);
最终字节[]数据=新字节[(int)file.length()];
fis.读取(数据);
fis.close();
返回新字符串(数据“UTF-8”);
}
公共静态字符串getInsertQuery(字符串文件名、字符串表名)引发IOException{
最终字符串内容=readWholeFile(文件名);
最终字符串[]行=content.split(“\n”);
if(lines.length<2)返回“”;//或抛出新异常(“行数不足”);
最终StringBuilder sb=新StringBuilder();
sb.追加(“插入到“+TableName+”(“+lines[0]。替换(“;”,“,”+”)值”);

对于(int i=1;i您可以使用POI Jar解析csv,rest是使用正确的insert语句创建一个文件,这样您就可以读取csv并在循环中将insert语句添加到文件中。

您可以使用POI Jar解析csv,rest是使用正确的insert语句创建一个文件,这样您就可以读取csv并在循环中添加insert语句您可以使用java非阻塞类
Files
使用
readAllLines
方法读取文件的所有行,然后使用模板
String
并使用
String
方法将其格式化为正确的值

然后使用
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);
然后,您将拥有如下模板
字符串


final String template=“插入表(%s)值(%s);”

您可以使用java非阻塞类
文件
使用
readAllLines
方法读取文件的所有行,然后使用模板
字符串
并使用
字符串
格式
方法将其格式化为正确的值

然后使用
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);
然后,您将拥有如下模板
字符串


final String template=“INSERT INTO TABLE(%s)VALUES(%s);”;

那么问题是什么?那么问题是什么?谢谢!我在您的示例中进行了研究,现在应用程序将获得.csv文件的名称并将其放入sql语句中,以便表名正确(我在上面发布了它)。在您的示例中,列和值是固定的。是否可以将它们的数量设置为变量,因为我想读取不同的.csv文件?!谢谢!我在您的示例中工作过,现在应用程序将获取.csv文件的名称并将其放入sql语句中,以便表名正确(我在上面发布了它)。在您的示例中,列和值是固定的。是否可以将它们的数量设置为变量,因为我要读取不同的.csv文件?!