【问题标题】:How to remove a particular entry from a csv file?如何从 csv 文件中删除特定条目?
【发布时间】:2016-01-18 16:24:56
【问题描述】:

我在 java 中有一个程序可以将地址保存和删除到 csv 文件中。现在我想从 csv 文件中删除一个特定的地址,所以我为此编写了一个函数 喜欢

public String deleteAddress(String firstName,String LastName,String msg) throws IOException{
  Iterator<Address> it = addressBook.iterator();
  n=msg;
        while(it.hasNext()){
            Address newObj = it.next();
            if((newObj.getFirstName().equalsIgnoreCase(firstName) == true) && (newObj.getLastName().equalsIgnoreCase(LastName) == true)){
                File newfile = new File("address.csv");
                BufferedWriter bw = new BufferedWriter(new FileWriter(newfile));
                it.remove();
                n="found and removed";
            }
       }


       for(Address newObj : addressBook){
            AddressBookSave.saveAddressBookToFile(newObj);
      }
       return n;
}
}

但它不能正常工作。请有人帮我解决这个问题。

【问题讨论】:

  • 什么是addressBook?您在方法的顶部调用iterator(),但在方法后面的for 循环之前没有定义名为addressBook 的变量。此外,您永远不会写信给您的BufferedWriter
  • addressBook 是一个集合
  • 看起来File new File 逻辑也没有做任何事情。此外,您是否打算在删除/修改地址条目后完全覆盖文件的内容? saveAddressBookToFile 方法的内容是什么?
  • 如果这对您有用,请将帖子标记为已回答。

标签: java csv filewriter


【解决方案1】:

请参考这个链接,Boolean.TRUE == myBoolean vs. Boolean.TRUE.equals(myBoolean)

这里假设addressBook 已正确填充数据。 在您的源代码中,您不应该使用== true 检查它,因为equalsIgnoreCase() 方法已经返回truefalse,仅此而已。

改成

if((newObj.getFirstName().equalsIgnoreCase(firstName)) && (newObj.getLastName().equalsIgnoreCase(LastName)))

另外为了避免NullPointerException,最好总是把你已经知道的值放在第一位,像这样,

if((firstName.equalsIgnoreCase(newObj.getFirstName())) && (LastName.equalsIgnoreCase(newObj.getLastName())))

【讨论】:

  • 你所说的是绝对正确的 Shrikant,但没有回答或解决问题。尽管语法“草率”,但他的 if 条件确实有效,并且评估与修改后的条件相同。
【解决方案2】:

您执行删除和添加的代码(包括加载和保存文件的逻辑)丢失或不完整。看起来你正在尝试做的事情实际上很容易。

不知道您的具体要求enter code here是什么,我无法一针见血。但是,这是一个完整的示例类,我用 Groovy 编写(非常接近 Java - 但更好),它完成了我“认为”你想要完成的事情。如果这对您有帮助,请将此示例标记为明确的答案。

随意运行下面的 Groovy 类并尝试一下。

import groovy.transform.Canonical

import javax.swing.*

public class AddressBook {
    List<Address> addressBook = new ArrayList<>();
    String filePath;

    public String deleteAddress(String firstName, String lastName) {
        String result = "Not Found"
        Iterator<Address> iter = addressBook.iterator();
        while(iter.hasNext()){
            Address addy = iter.next();
            if ((addy.getFirstName().equalsIgnoreCase(firstName)) && (addy.getLastName().equalsIgnoreCase(lastName))) {
                iter.remove();
                result = "Address was found and removed..save to update the file.";
            }
        }

        println result;
        return result;
    }

    void addAddress(String firstName, String lastName, String addyString){
        addressBook.add(new Address("firstName":firstName, "lastName":lastName, "address":addyString));
        println "Address added..save to update the file.";
    }

    void saveAddressBookToFile() throws IOException{
        BufferedWriter bw = null;
        println "Saving addresses to file: " + filePath;
        try{
            File file = new File(filePath);
            bw = new BufferedWriter(new FileWriter(file));
            file.createNewFile()
            for(Address addy: addressBook){
                bw.write(addy.toString() + "\n");
            }
            bw.flush();
        }
        finally{
            if(bw){
                bw.close();
            }
        }
    }

    void loadAddressBook(String path) throws IOException{
        addressBook.clear();
        filePath = path;
        BufferedReader br = null;
        try{
            List<String> lines = new BufferedReader(new FileReader(path)).readLines();
            for(String line: lines){
                addressBook.add(new Address(line));
            }
            println path + " loaded successfully."
        }
        catch(FileNotFoundException fnfe){
            println "File " + path + " does not exist, nothing loaded.";
        }
        finally {
            if (br) {
                br.close()
            }
        }
    }

    void printLoadedAddresses(){
        for(Address addy: addressBook){
            println addy.prettyString();
        }
    }

    public static void main(String... args) {
        AddressBook ab = new AddressBook();
        String readln = ' '

        while(readln){
            readln = JOptionPane.showInputDialog('Please input a valid command: load, add, delete, save')

            if (readln) {
                args = readln.split()
                switch (args[0]) {
                    case "load":
                        if (args.length < 2) {
                            println("You did not provide the second argument for the address csv file path.")
                            break;
                        } else {
                            ab.loadAddressBook(args[1])
                        }
                        break;
                    case "add":
                        if(args.length < 4){
                            println("Please provide the firstName, lastName, and address parameters when adding.")
                        }
                        else {
                            ab.addAddress(args[1], args[2], args[3..-1].join(" "));
                        }
                        break;
                    case "delete":
                        if(args.length < 3){
                            println("Please provide the firstName, lastName, and address parameters when deleting.")
                        }
                        else {
                            ab.deleteAddress(args[1], args[2]);
                        }
                        break;
                    case "save":
                        if (ab.filePath) {
                            ab.saveAddressBookToFile();
                        } else {
                            println("You must first call load with a file path for the csv file (even it it doesn't exist yet.")
                        }
                        break;
                    case "print":
                        ab.printLoadedAddresses();
                        break;
                    case "exit":
                        System.exit(0)
                    default:
                        println "Unrecognized command: " + args[0]
                }
            }
        }
    }
}

@Canonical
class Address {
    String firstName;
    String lastName;
    String address;

    public Address(){
        super
    }

    public Address(String csvString){
        List<String> tokens = csvString.split(",");
        firstName = tokens[0];
        lastName = tokens[1];
        address = tokens[2]
    }

    @Override
    public String toString(){
        return firstName + "," + lastName + "," + address;
    }

    public String prettyString(){
        return firstName + " " + lastName + " - " + address;
    }
}

【讨论】:

  • 我应该在deleteAddress(String firstName, String lastName)result = "Address was found and removed..save to update the file."; 之后拨打saveAddressBookToFile() 吗?
  • 是的,您需要调用 save 作为单独的命令/操作。
  • 您可以修改代码以在添加和/或删除方法中调用保存方法,以便在进行更改后使保存更加“自动”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多