目前处理此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确实有正确数量的验证条目。
答案 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>/"