【问题标题】:How to remove a row from a csv file if that row contains a certain data in java如果该行包含java中的某些数据,如何从csv文件中删除一行
【发布时间】:2021-04-06 20:02:18
【问题描述】:

我有一个基本上模仿数据库的 csv 文件,如果 csv 文件包含我提供的用户名输入,我的目标是从该 csv 中删除一行

当前的 csv 文件是:

   Jack chan,customer,jack@yorku.ca,jack12,3144134414,13 Arboretum,user2
   Donald tusk,customer,donald@yorku.ca,donald1,1213141114,14 Arboretum,user3 
   tom jack,customer,tom11@yahoo.com,tom44,131344122,14 wells st,user34
   jack,parking officer,12rfw@hmail.com,jack,12131131134,12ddcscs,peo1
   jewel khan,parking officer,jkhan@hotmail.com,jwel12,2131412141,12 wliis str,peo2
   shane li,parking officer,shane@gmail.com,shaneli,1343513414,13 mac st,peo33
   james chang,parking officer,james15@gmail.com,james12,31452434114,13 chang st,peo77

我的目标是使用他的用户名“shaneli”删除 say Shane li 的行,而不会对其他数据造成任何更改。但我当前的代码不会导致文件的其他数据发生变化

预期的输出 csv 文件是带有 shaneli 的行被删除,而其他行保持不变:

   Jack chan,customer,jack@yorku.ca,jack12,3144134414,13 Arboretum,user2
   Donald tusk,customer,donald@yorku.ca,donald1,1213141114,14 Arboretum,user3 
   tom jack,customer,tom11@yahoo.com,tom44,131344122,14 wells st,user34
   jack,parking officer,12rfw@hmail.com,jack,12131131134,12ddcscs,peo1
   jewel khan,parking officer,jkhan@hotmail.com,jwel12,2131412141,12 wliis str,peo2
   james chang,parking officer,james15@gmail.com,james12,31452434114,13 chang st,peo77

这是我拥有的代码 java 代码,我需要一个 java 解决方案:

private static String userPath = "/CSVs/database.csv";
    
public void removeUser(String name,String userType,String email,String userName,String phoneNumber,String address,String password) {
        
        // FIX THIS
        String tmpFile = "tmp.csv";
//      String target1 = ""; String target2 = ""; String target3 = ""; String target4 = ""; String target5 = "";String target6 = "";String target7 = "";
        String target = "";
        File oldFile = new File(userPath);
        File newFile = new File(tmpFile);
        
        System.out.println(userName);
        try {
            FileWriter fw = new FileWriter(tmpFile, true);
            BufferedWriter bfw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bfw);
            x = new Scanner(new File(userPath));
            x.useDelimiter("[,\n]");
            
            while (x.hasNext()) {
                target = x.next();
                if (!target.equals(userName)) {
                    pw.printf("%s,%s,%s,%s,%s,%s,%s\n", name, userType,email,userName,phoneNumber,address,password);
//                  pw.println(target + "," + target + "," + target + "," + target + "," + target + "," + target + "," + target);
                }
            }
            x.close();
            pw.flush();
            pw.close();
            oldFile.delete();
            File dmp = new File(userPath);
            newFile.renameTo(dmp);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

请指教 提前致谢!!

【问题讨论】:

    标签: java database csv


    【解决方案1】:

    解决方案

    我想出的方法是执行以下操作:

    1. 创建一个新文件
    2. 如果用户名不相等,加行,否则跳过

    正如我们已经列出了我们的步骤,我们可以创建一个函数来完成每个步骤。

    代码

    1) 创建一个新文件

    private void createFile(){
        try {
            File myObj = new File("CSVs/tmpFile.csv");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    然后我们可以创建文件,该文件将存储在所需的文件路径并存储为tmpFile.csv

    2) 如果用户名不相等,则添加一行

    private void addDataContents(String userNameToDelete){
        try{
            String userPath = "CSVs/database.csv";
            BufferedReader csvReader = new BufferedReader(new FileReader("CSVs/database.csv"));
            String row;
            FileWriter myWriter = new FileWriter("CSVs/tmpFile.csv");
    
            while (((row = csvReader.readLine()) != null)){
                String[] line = row.split(",");
                if (!line[3].equals(userNameToDelete)){
                    myWriter.write(row + "\n");
                }
            }
            myWriter.close();
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    然后我们通读database.csv 的内容。我们逐行读取每一行并用逗号分隔行,因为它是一个 CSV 文件(逗号分隔值)。由于用户名将始终存储在第三个索引中,我们可以将我们希望删除的用户名与存储在索引中的值进行比较。如果它们不一样,我们可以继续将这一行写入我们的新文件。如果它们相同,我们的循环将继续到下一行。

    最后说明

    我希望所有内容都易于阅读和理解。

    【讨论】:

      【解决方案2】:

      您需要从 CSV 文件中删除包含特定数据的整行。如果您尝试使用高级语言来执行此操作,Java 代码将相当长。在开源 Java 包 SPL 中完成任务非常简单。只需要一行代码,如下图:

      A
      1 >file("tmp.csv").export@c(file("database.csv").import@wc().select(~(4)!=userNameToDelete))

      SPL 提供 JDBC 驱动程序供 Java 调用。只需将上述 SPL 脚本存储为 removeUser.splx 并以与调用存储过程相同的方式在 Java 中调用它:

      …
      Class.forName("com.esproc.jdbc.InternalDriver");
      con= DriverManager.getConnection("jdbc:esproc:local://");
      st = con.prepareCall("call removeUser(?)");
      st.setObject(1,"shaneli");
      st.execute();
      …
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 2014-04-03
        • 2014-03-26
        • 2022-01-17
        • 1970-01-01
        • 2020-03-27
        相关资源
        最近更新 更多