如何使用 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;
}
}
遇到这个问题,一箭双雕
我目前正在尝试将文本字段中的用户输入输出到现有的 .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;
}
}