CSV 파일에서 줄을 삭제하려고, 내 코드는 다음 줄의 선 반을 삭제

anon12524 :

안녕 내가 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

누군가의 도움이 내게는이 문제를 해결할 수 있을까요?

TheWhiteRabbit :

당신은 ID 및 마크를 얻기 위해 2 번 스캔 불구하고 귀하의 입력 파일은, 레코드 당 1 개 쉼표가 포함되어 있습니다. 첫 번째 검사는 당신에게 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.");

        }
    }

또한 autocloseables를 사용하거나 적어도 좋은 최적화 될 적절히 자원을 관리 할 수 ​​있습니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=280860&siteId=1