在将旧CSV文件和LOAD DATA INFILE中的信息验证到MySQL后,打印新的CSV文件

时间:2017-10-18 17:38:25

标签: java mysql csv model-view-controller netbeans

目前处理此CSV文件包含大量条目。然后我做了一些验证并将验证的条目插入到新的CSV文件中。最后,我为新的CSV文件做了一个LOAD DATA INFILE sql查询,但是我在数据库中得到了0个结果。 LOAD DATA INFILE查询能够加载旧的CSV文件。

以下代码调用方法

createNewUserCSV(validatedUsers, OUTPUT_PATH);
String csvDirectory = OUTPUT_PATH + File.separator + "newUser.csv";
String getCSVDirectory = csvDirectory.replace(File.separator, "/");
userDAO.insertUserByFile(getCSVDirectory);

这是我的createNewUserCSV方法(此代码似乎工作正常,因为我可以看到newUser.csv已创建并位于我指定的文件夹中。

private void createNewUserCSV(ArrayList<User> validatedUsers, String outputPath) {
    try{
        PrintWriter writer = new PrintWriter(new FileOutputStream(outputPath + File.separator + "newUser.csv", true));
        StringBuilder sb = new StringBuilder();
        sb.append("name");
        sb.append(',');
        sb.append("password");
        sb.append(',');
        sb.append("email");
        sb.append(',');
        sb.append("gender");
        sb.append('\n');

        for(User user: validatedUsers){
            sb.append(user.getName());
            sb.append(',');
            sb.append(user.getPassword());
            sb.append(',');
            sb.append(user.getEmail());
            sb.append(',');
            sb.append(user.getGender());
            sb.append('\n');
        }

        writer.write(sb.toString());
        writer.close();

    }catch (IOException e){
        e.printStackTrace();
    }
}

但是,当我尝试对newUser.csv使用LOAD DATA INFILE时,它不起作用,但它适用于oldUser.csv但是对于查询。

 public void insertUserByFile(String csvFileDirectory) {
    //boolean success = true;
    try {
        conn = dbController.getConnection();
        //Load data infile
        query = "LOAD DATA LOCAL INFILE '" + csvFileDirectory + "' INTO TABLE user " 
                    +"FIELDS TERMINATED BY ',' " 
                    +"ENCLOSED BY '\"' " 
                    +"LINES TERMINATED BY '\r\n' " 
                    +"IGNORE 1 LINES";
        pstmt = conn.prepareStatement(query);
        pstmt.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
        //success = false;
    } finally {
        if (dbController != null) {
            dbController.close(conn, pstmt, rs);
        }
    }
    //return success;
}

所有测试均在当地进行

上传newUser.csv时从MySQL输出

0 row(s) affected Records: 0  Deleted: 0  Skipped: 0  Warnings: 0

上传oldUser.csv时从MySQL输出

21396 row(s) affected

我的newUser.csv有问题吗? 我的newUser.csv确实有正确数量的验证条目。

1 个答案:

答案 0 :(得分:1)

您在createNewUserCSV()中追加\n,但是您使用\r\n调用LOAD DATA INFILE。所以替换:

LINES TERMINATED BY '\r\n'

使用:

LINES TERMINATED BY '\n'

或将\r\n附加到createNewUserCSV()。

另外,关于LOAD DATA INFILE,可能会遇到错误 - 可能没有在屏幕上看到它:

  

ERROR 1290(HY000):MySQL服务器正在运行   --secure-file-priv选项,因此无法执行此语句

这意味着:LOAD DATA INFILE无权读取csv文件(newUser.csv)。然后,您必须自己在数据库的配置文件(my.cnf或my.ini)中设置secure-file-priv。像这样:

[mysqld]
secure-file-priv = "<PATH-TO-FOLDER-CONTAINING-THE-CSV-FILES>/"