2017-10-18 62 views
0

当前正在处理此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确实具有正确数量的验证条目。

回答

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-文件私法选项,所以它不能执行该语句

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

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

作品喜欢魔术,谢谢! – Raynoro

+0

不客气。 – 2017-10-19 13:56:44

0

还要注意的是[默认]你只能读取和写入存储在神圣的位置的文件,如变量指定@@ 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>