Как удалить содержимое в CSV-файле на основе предоставленного значения?

#java

#java

Вопрос:

В настоящее время я пытаюсь решить эту проблему, из-за которой, похоже, я не могу удалить конкретное содержимое файла csv.

 package projectasdp;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class Test {
    private static Scanner x;

    public static void main(String[] args) {
        String filepath = "TradeDetails.txt";
        String removeTerm = "3";

        removeRecord(filepath, removeTerm);
    }

    public static void removeRecord(String filepath, String removeTerm) {
        String tempFile = "temp.txt";
        File oldFile = new File(filepath);
        File newFile = new File(tempFile);

        String animalID = "";
        String seller = "";
        String buyer = "";
        String wayToTrade = "";
        String tradeID = "";

        try {
            FileWriter fw = new FileWriter(tempFile, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            x = new Scanner(new File(filepath));
            x.useDelimiter("[,rn] ");

            while(x.hasNext()) {
                animalID = x.next();
                seller = x.next();
                buyer = x.next();
                wayToTrade = x.next();
                tradeID = x.next();

                if(!animalID.equals(removeTerm)){
                    pw.println(animalID   ","   seller   ","   buyer   ","   wayToTrade   ","   tradeID );
                }
            }
            x.close();
            pw.flush();
            pw.close();
            oldFile.delete();
            File dump = new File(filepath);
            newFile.renameTo(dump);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error");
        }
    }
}
  

CSV:

 0,Ann,Jesca,offonline,20180411091801
3,Dave,Dianna,online,20180418105901
6,Dianna,Flynn,offonline,20180418162304
25041019042018,Lex,Ada,online,20180419102911
123456,D,Lucasy,offonline,2018042316230011333,ggg,EEE,online,20190319135223
334,John,Malik,online,20190319135310
  

Идея здесь в том, чтобы удалить всю информацию идентификатора 3, которая в данном случае является 3,Dave,Dianna,online,20180418105901 . Я указал это с помощью переменной removeTerm.

До сих пор мне не удалось заставить это работать, и есть другие решения этой проблемы, с которыми я, возможно, не знаком, поэтому я был бы очень признателен за любую помощь.

Комментарии:

1. Что не работает? Что вы получаете?

2. Кстати, 5-я строка, похоже, представляет собой объединение двух строк.

3. Ошибка. Файл csv не обновляется, ничего не удаляется

Ответ №1:

Ошибка, которую вы получаете, java.util.NoSuchElementException при чтении файла.
Это вызвано тем фактом, что 2 строки объединены.
2018042316230011333 в 5-й строке интерпретируется как traceId.
Следующее поле (ggg) интерпретируется как следующий AnimalID.
Из-за этого последнее поле в последней строке считается wayToTrade. Затем, пытаясь прочитать окончательный traceId, вы получаете ошибку.

Может быть, лучше прочитать файл построчно, разбить его на свои поля и пропустить строку в случае, если первое поле равно указанному removeTerm.

Комментарии:

1. решит ли проблему удаление ,ggg,EEE,online,20190319135223 ?

2. Вместо удаления этой части, вы можете захотеть вставить новую строку перед 11333,ggg

3. хм, почему-то это ничего не делает для меня, как будто ничего не отображается.

4. Ничего не появилось, значит, ошибка не была обнаружена? Был ли файл обновлен?

5. Запустите отладчик и попытайтесь понять, почему строка не удаляется. Я скопировал ваш код в eclipse и создал файл, как указано. Все сработало, как ожидалось.