java - 验证旧 CSV 文件中的信息后打印写入新 CSV 文件并将 DATA INFILE 加载到 MySQL 中

标签 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 确实具有正确数量的已验证条目。

最佳答案

看起来您正在 createNewUserCSV() 内附加 \n,但您正在使用 \r\n 调用 LOAD DATA INFILE。所以替换:

LINES TERMINATED BY '\r\n'

与:

LINES TERMINATED BY '\n'

或在 createNewUserCSV() 中附加 \r\n

此外,关于 LOAD DATA INFILE,您可能会遇到错误 - 也许没有在屏幕上实际看到它:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

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

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

关于java - 验证旧 CSV 文件中的信息后打印写入新 CSV 文件并将 DATA INFILE 加载到 MySQL 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46816080/

相关文章:

java - 带有 hibernate 验证的 Spring MVC 不起作用

java - 转换 XML 中的任何 ActionScript 类

mysql - SQL 存储过程 - 变量太短

mysql - 我如何在我的 CSV 中将 ,, 正则表达式表示为 ,\N, 以便 mysqlimport 理解它们?

Python DictWriter 编写 UTF-8 编码的 CSV 文件

java - 如何在 Swagger 中描述多态端点?

php - 通过查询拆分列以将提取内容插入到另一列中。不工作

mysql - 从特定的列列表中计数非空列,然后在每行的 where 子句中进行比较

Linux CSV 根据大文件中的旧日期删除重复项(超过 100k 记录)

java - 如何创建灵活的 MVC 结构?