当前正在处理此包含大量条目的 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/