首页 > 解决方案 > 试图从 CSV 文件中删除一行,我的代码删除了一行和下一行的一半

问题描述

嗨,我需要能够删除 CSV 文件中的一行。我的代码当前删除了一行,直到下一行的第一个逗号。

我已经尝试更改扫描仪分隔符,但我无法让它按照我的需要工作。

public void deleteRecord() { 
        String filePath = "marks.txt";
        System.out.println("Enter the StudentID of the record you wish to delete: ");
        Scanner in = new Scanner(System.in);
        String removeTerm = in.nextLine();
        String tempFile = "temp.txt";
        File oldFile = new File(filePath);
        File newFile = new File(tempFile);

        try {
            FileWriter fw = new FileWriter(tempFile,true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            Scanner scan = new Scanner(oldFile);
            scan.useDelimiter("[,]");

            while (scan.hasNext()) {
                String ID = scan.next();
                String Mark = scan.next();
                if (!ID.equals(removeTerm)) {
                    pw.println(ID + "," + Mark);
                }
            }
            scan.close();
            pw.flush();
            pw.close();
            oldFile.delete();
            File dump = new File(filePath);
            newFile.renameTo(dump);
            System.out.println("Record successfully deleted.");

        } catch(IOException e) {
            System.out.println("Error has occured.");

        }
    }
B00987,58
B00567,43
B00343,59
B00653,25
B00757,31
B00876,40
B00421,62
B00568,78
B00826,79
B00126,93
B00862,62
B00999,12
B00237,68
B00762,85
B00864,49

这是删除一行之前的文件。我会尝试删除第一行。

43
B00343,59
B00653
25
B00757,31
B00876
40
B00421,62
B00568
78
B00826,79
B00126
93
B00862,62
B00999
12
B00237,68
B00762
85
B00864,49

这就是发生的事情。

我需要它看起来像这样。

B00567,43
B00343,59
B00653,25
B00757,31
B00876,40
B00421,62
B00568,78
B00826,79
B00126,93
B00862,62
B00999,12
B00237,68
B00762,85
B00864,49

有人可以帮我解决这个问题吗?

标签: java

解决方案


您的输入文件每条记录仅包含 1 个逗号,但您扫描 2 次以获得 ID 和标记。所以第一次扫描会给你ID'B00987'并标记'58 B00567'。

您可以使用扫描仪并添加多个分隔符,如下所示:

s.useDelimiter(",|\\n");

这样,扫描仪将扫描到逗号和新行。

不过,我不经常使用扫描仪,在您的情况下,我什至更喜欢使用 BufferedReader:

  public void deleteRecord() { 
        String filePath = "marks.txt";
        System.out.println("Enter the StudentID of the record you wish to delete: ");
        Scanner in = new Scanner(System.in);
        String removeTerm = in.nextLine();
        String tempFile = "temp.txt";
        File oldFile = new File(filePath);
        File newFile = new File(tempFile);

        try {
            FileWriter fw = new FileWriter(tempFile,true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            BufferedReader reader = new BufferedReader(new FileReader(oldFile);

            String line = "";
            while((line = reader.readLine()) != null) {
              if(!line.startsWith(removeTerm)) {
                pw.println(line);
              }
            }
            reader.close();
            pw.flush();
            pw.close();
            oldFile.delete();
            File dump = new File(filePath);
            newFile.renameTo(dump);
            System.out.println("Record successfully deleted.");

        } catch(IOException e) {
            System.out.println("Error has occured.");

        }
    }

同样使用自动关闭或至少正确管理资源将是一个很好的优化。


推荐阅读