PrintWrite验证旧CSV文件和LOAD DATA INFILE中的信息到MySQL后的新CSV文件
当前正在处理此CSV文件,其中包含大量条目。然后我做了一些验证并将验证的条目插入到新的CSV文件中。最后,我为新的CSV文件做了一个LOAD DATA INFILE sql查询,但是我在数据库中得到了0个结果。 LOAD DATA INFILE查询能够加载旧的CSV文件。PrintWrite验证旧CSV文件和LOAD DATA INFILE中的信息到MySQL后的新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();
}
}
然而,当我尝试使用LOAD DATA INFILE对newUser.csv这是行不通的,它适用于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;
}
所有测试均在本地
输出从MySQL在上传时的oldUser.csv
21396 row(s) affected
是我newUser.csv有从MySQL上传newUser.csv
0 row(s) affected Records: 0 Deleted: 0 Skipped: 0 Warnings: 0
输出完成问题? 我的newUser.csv确实具有正确数量的验证条目。
它在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-文件私法选项,所以它不能执行该语句
这意味着:在LOAD DATA INFILE没有权限读取csv文件(newUser.csv
)。然后,您必须自己在数据库的配置文件(my.cnf或my.ini)中设置secure-file-priv
。就像这样:
[mysqld]
secure-file-priv = "<PATH-TO-FOLDER-CONTAINING-THE-CSV-FILES>/"
还要注意的是[默认]你只能读取和写入存储在神圣的位置的文件,如变量指定@@ GLOBAL.secure_file_priv
Ubuntu的16。04(EASY):找出你可以写
mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| /var/lib/mysql-files/ |
+---------------------------+
1 row in set (0.00 sec)
然后,只写有
mysql> SELECT * FROM train INTO OUTFILE '/var/lib/mysql-files/test.csv' FIELDS TERMINATED BY ',';
Query OK, 992931 rows affected (1.65 sec)
mysql>
作品喜欢魔术,谢谢! – Raynoro
不客气。 – 2017-10-19 13:56:44