如何使用 FileWriter 将用户输入附加到新行,同时避免我的 .CSV 文件中可能出现重复?

How can I append user input to a new line whilst also avoiding possible duplicates within my .CSV file using FileWriter?

遇到这个问题,一箭双雕

我目前正在尝试将文本字段中的用户输入输出到现有的 .CSV 文件中,其中已包含数据。我的第一个问题源于无法追加到新行,我的代码当前正在追加到 .CSV 文件中的最后一项,因此创建了更长的行,而不是新行。

接下来,我想检查我的 .CSV 文件中是否存在用户输入的可能重复项。如果用户想要将香蕉添加到列表中,并且代码检查 .CSV 文件并在文件中找到香蕉,那么我们可以成功抛出错误并警告用户。

这是我的代码,目前试图尝试追加到一个新行,但不知何故它不起作用:

    String fileName = "temp.csv";
    try {
        FileWriter fileWriter = 
            new FileWriter(fileName, true);

        BufferedWriter bufferedWriter =
                new BufferedWriter(fileWriter);

        bufferedWriter.write("\n" + fruitNameField.getText());
        bufferedWriter.write(',');
        bufferedWriter.write(quantityOfFruitField.getText());
        bufferedWriter.write(',');
        bufferedWriter.write(fruitLocationField.getText());
        //bufferedWriter.write(',');

        bufferedWriter.close();

    }
    catch(IOException ex)
    {
        System.out.println("Error writing to file" + fileName + "'");
    }

虽然我想要 3 个不同的用户输入并附加到一个新行,但上面的代码最终输出如下:Banana,2,storeOrange,3,store。似乎忽略了新行命令。

现在是我的第二个问题,检查重复项。在我的一生中,我找不到任何与使用 java.

检查文本文件中的重复项相关的资源

这个问题主要是为了追加到一个新行,但如果我能得到任何帮助,那就太好了。

据我所知,为了检查重复项,我相信我必须导入我的文本文件并将其写入数组,但如果它是一个大文件怎么办?

一旦我的文件在数组中,我将检查用户输入是否等于数组中的任何文本,如果是,则抛出错误。这就是我在这个问题上的方法,请告诉我是否可以通过任何方式改进它。

非常感谢您的帮助。

如果文件不是很大,我建议读取整个文件并将其存储在 Map 中,其键是您要添加的词(您要检查重复项)。 在每一个新行上,您可以检查地图是否包含密钥(仅花费 O(1),因此效率很高)。

对于换行符,注意它取决于环境,它可能是\r\n(对于Windows)或\n对于Unix/Mac OS .最好是使用 System.getProperty("line.separator");

我建议使用像 opencsv 这样的库来读取和写入 csv 文件。

示例:

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class JavaApplication28 {

    public static void main(String[] args) throws IOException {
        String input = fruitNameField.getText();
        String filename = "temp.csv";

        writeToCsvFile(input,filename);
    }

    private static void writeToCsvFile(String input, String filename) throws IOException {
        if(!isDuplicate(input,filename)){
            CSVWriter writer = new CSVWriter(new FileWriter(filename,true), ',');
            String[] entries = {fruitNameField.getText(),quantityOfFruitField.getText(),fruitLocationField.getText()};
            writer.writeNext(entries);
            writer.close();
        }
        else{
            System.out.println("fruitName already exists.");
        }        
    }

    private static boolean isDuplicate(String input, String filename) throws IOException  {
        boolean found = false;
        CSVReader reader = new CSVReader(new FileReader(filename));
        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {
           for(int i = 0; i<nextLine.length; i++){
               if(nextLine[i].equalsIgnoreCase(input)){
                   found = true;
                   break;
               }
           }           
        }
        return found;
    }    
}